4 votos

Intersección, Unión están fallando en 10.1

Después de una gran ayuda de Blah238.

He encontrado exactamente lo que es el problema.

He perdido unos días, revisando nuestros datos, y tratando de muchas cosas.

El problema que no puedo hacer la intersección entre dos polilíneas para dar un resultado de una nueva polilínea.

Estaba trabajando en la 9.3. Así que no estoy seguro si es que no se supone que funciona , o por qué no se trabaja en 10.1

Así que, he modificado el código para esto. Ahora este código está generando COM excepción en mi máquina.

Bla, puede usted por favor ayuda si usted puede

        static void Main(string[] args)
    {
        //ESRI License Initializer generated code.
        m_AOLicenseInitializer.InitializeApplication(new esriLicenseProductCode[] { esriLicenseProductCode.esriLicenseProductCodeStandard, esriLicenseProductCode.esriLicenseProductCodeAdvanced },
        new esriLicenseExtensionCode[] { });

        var geom1 = "LINESTRING (2 1, 7 1)".ToGeometry();
        var geom2 = "LINESTRING (3 1, 6 1)".ToGeometry();
        var targetOperator = (ITopologicalOperator)geom1;
        targetOperator.Simplify();

        IGeometry intersectGeometry = targetOperator.Intersect(geom2, geom2.Dimension);
        Console.WriteLine(overlapped1.ToWellKnownText());


        m_AOLicenseInitializer.ShutdownApplication();

    }

    static IGeometry GetOverlappedGeometry(IGeometry sourceGeometry, IGeometry targetGeometry, esriGeometryDimension dimension)
    {
        IGeometry overlappedGeometry = null;

        IGeometry localSourceGeometry;
        IGeometry localTargetGeometry;

        if (sourceGeometry.GeometryType > targetGeometry.GeometryType)
        {
            localSourceGeometry = targetGeometry;
            localTargetGeometry = sourceGeometry;
        }
        else
        {
            localSourceGeometry = sourceGeometry;
            localTargetGeometry = targetGeometry;
        }

        var targetOperator = (ITopologicalOperator)localTargetGeometry;

        if (targetOperator != null)
        {
            targetOperator.Simplify();

            IGeometry intersectGeometry = targetOperator.Intersect(localSourceGeometry, dimension);

            overlappedGeometry = intersectGeometry;
        }

        return overlappedGeometry;
    }

Por favor, observe que el código es diferente que Bla código de abajo , que yo estoy usando la dimensión 1 es la intersección, y no dim0 Porque quiero una polilínea Cuál es el problema con la 10.1?

Por qué yo era capaz de hacerlo en 9.3?

2voto

auramo Puntos 161

Actualización: al Parecer, esta es fija en 10.2: ITopologicalOperator::Intersect() falla con la superposición horizontal o vertical polilíneas en ArcGIS 10.1.

Si puedo modificar su firma de método que me permita especificar la espera de la dimensión de la intersección puedo conseguir el resultado esperado, dadas mis casos de prueba (en WKT a continuación).

He adaptado la WKT los métodos de extensión (repo de GitHub aquí) de la DNRGPS de origen. LINQPad 4 de consulta Esencial aquí.

using System;
using DnrGps_Wkt;
using ESRI.ArcGIS.Geometry;

namespace WKTTest
{
    class Program
    {
        static void Main(string[] args)
        {
            if (ESRI.ArcGIS.RuntimeManager.ActiveRuntime == null)
                ESRI.ArcGIS.RuntimeManager.BindLicense(ESRI.ArcGIS.ProductCode.EngineOrDesktop);

            var geom1 = "LINESTRING (0 0, 2 2)".ToGeometry();
            var geom2 = "POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))".ToGeometry();
            var geom3 = "LINESTRING (0 1, 1 0)".ToGeometry();
            var overlapped1 = GetOverlappedGeometry(geom1, geom2, esriGeometryDimension.esriGeometry1Dimension);
            Console.WriteLine(overlapped1.ToWellKnownText());
            var overlapped2 = GetOverlappedGeometry(geom3, overlapped1, esriGeometryDimension.esriGeometry0Dimension);
            Console.WriteLine(overlapped2.ToWellKnownText());
        }

        static IGeometry GetOverlappedGeometry(IGeometry sourceGeometry, IGeometry targetGeometry, esriGeometryDimension dimension)
        {
            IGeometry overlappedGeometry = null;

            IGeometry localSourceGeometry;
            IGeometry localTargetGeometry;

            if (sourceGeometry.GeometryType > targetGeometry.GeometryType)
            {
                localSourceGeometry = targetGeometry;
                localTargetGeometry = sourceGeometry;
            }
            else
            {
                localSourceGeometry = sourceGeometry;
                localTargetGeometry = targetGeometry;
            }

            var targetOperator = (ITopologicalOperator)localTargetGeometry;

            if (targetOperator != null)
            {
                targetOperator.Simplify();

                IGeometry intersectGeometry = targetOperator.Intersect(localSourceGeometry, dimension);

                overlappedGeometry = intersectGeometry;
            }

            return overlappedGeometry;
        }
    }
}

Esta salida:

LINESTRING (0 0,1.00000190734863 1.00000190734863)
MULTIPUNTO (0.500001907348633 0.500001907348633)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X