10 votos

¿Cómo ArcGIS calcular la distancia entre dos puntos con un no a la misma distancia de proyección?

Esta es una pregunta de seguimiento a mi anterior, se Puede sugerir algún bien escrito textos introductorios sobre el sistema de coordenadas de las proyecciones?


Supongamos que yo estoy trabajando con el CH1903 proyección de mapa, que para todo lo que sé es de conformación, pero no equidistantes. Significado, ángulos (forma) se han conservado, pero no áreas, distancias, o la escala. (Al menos estos no se han conservado exactamente). Hasta ahora tan bueno.

Me pregunto qué tipo de cálculo de ArcGIS realiza cuando quiero calcular la distancia entre dos puntos. En ArcObjects, podría usar el IProximityOperator interfaz de la siguiente manera:

IPoint a = ...,
       b = ...;

double distance = ((IProximityOperator)a).ReturnDistance(b);

Pregunta: Cuando estoy trabajando con un sistema de referencia que no es preciso preservar las distancias, ¿qué sería de ArcGIS hacer cuando me consulta para la distancia entre dos puntos (como se muestra arriba)?

  • No es simplemente hacer algo de matemáticas de Pitágoras (a2 + b2 = c2) para obtener la distancia, es decir, la devuelve a distancia sólo será tan exacta como la de la proyección permite?

  • O va a hacer algo más complicado, como una forma de re-proyección, para obtener una información más precisa de la distancia?

(La misma pregunta, pero de manera más general: una Vez que las geometrías han sido proyectados, ¿ ArcGIS de realizar todos los cálculos simplemente en el espacio Euclidiano, o no la usa proyección de mapa, todavía influyen en los cálculos de distancias, ángulos, áreas, etc.)?

16voto

Shog9 Puntos 340

En ArcGIS 10, echa un vistazo IGeometryServer2 que ahora ha GetDistanceGeodesic (distancia geodésica entre dos geometrías), GetLengthsGeodesic (retorno de la línea geodésica longitudes de cada polilínea), y DensifyGeodesic (densificar una polilínea por el trazado de los puntos a lo largo de la línea geodésica líneas que unen los vértices, los usos IPolycurve4::GeodesicDensify) métodos.

Como se ha mencionado en las otras respuestas, ArcGIS utiliza todavía en su mayoría planas de los cálculos.

Melita Kennedy


Algunos comentarios sobre las otras respuestas (no suficiente rep sin embargo, para comentar directamente!).

Esri azimutal equidistante de proyección apoya elipsoides. El GreatCircleDist código es la creación de un PC que utiliza un elipsoide/esferoide basado en la GCS, por lo que las distancias desde el centro/punto de origen será geodésica distancias, no gran círculo de grandes distancias. También podría ser simplificado. Sabemos que la proyección de coordenadas del primer punto porque es el centro de la proyección: 0,0. Tan sólo el 2 ° punto debe ser proyectada. Una versión simplificada de la EuclidianDistance función podría ser utilizado.

He comprobado los resultados en contra de la pe.dll's geodésica funciones y que coincide. Parece que Richie aplicación es el uso de una esfera, por lo que es regresar gran círculo de distancias y coordenadas en su aplicación de prueba. Es por eso que los resultados no coinciden. No me reconoce los valores de los radios; creo que tengo que hablar con él acerca de ello!

8voto

cjstehno Puntos 131

La exactitud de la respuesta acerca de ArcGIS está sujeta a cambios en cualquier momento-para todos los sabemos, los nuevos procedimientos será presentado en el próximo service pack sin advertencia o documentación. Dicho esto, el software de ESRI ha durante mucho tiempo utilizado Euclidiana cálculos (por ejemplo, la fórmula de Pitágoras para distancias) cuando coordenadas proyectadas se utilizan. A menudo, en los cálculos como en el que se ilustran, el software no tienen siquiera acceso a la información de proyección, así que ¿qué más se puede hacer?

Su pregunta en sí misma parece sugerir que la distancia Euclídea cálculos para una proyección equidistante son correctos. Nada podría estar más lejos de la verdad. Para un punto equidistante de proyección, la distancia Euclidiana para el punto base se garantiza la igualdad de la distancia geodésica; para un punto equidistante de proyección, la distancia Euclidiana a punto de base se garantiza la igualdad de la distancia geodésica. A cambio de esas garantías, la métrica, la distorsión entre todos los otros pares de puntos es normalmente mucho mayor en comparación con otras proyecciones que uno puede elegir.

5voto

saint_groceon Puntos 2696

Si desea un método estable de la informática geodésica distancias, recomiendo Richie Carmichael del contenedor para ESRI Motor de Proyección.

Actualización: acabo de intentar de Richie código con ArcGIS 10.0 en Vista64 y obtener una excepción después de llamar a LoadLibrary. Voy a mirar en que más tarde.

Por ahora, aquí está el código en respuesta a las preguntas en los comentarios de otra respuesta.

El código compara IProximityOperator para los puntos con y sin referencias espaciales. A continuación, se muestra cómo utilizar un azimutal equidistante de proyección (con el primer punto es el punto de tangencia) para encontrar la distancia ortodrómica.

private void Test()
{
    IPoint p1 = new PointClass();
    p1.PutCoords(-98.0, 28.0);

    IPoint p2 = new PointClass();
    p2.PutCoords(-78.0, 28.0);

    Debug.Print("Euclidian Distance {0}", EuclidianDistance(p1, p2));
    Debug.Print("Distance with no spatialref {0}", GetDistance(p1, p2));

    ISpatialReferenceFactory srf = new SpatialReferenceEnvironmentClass();
    IGeographicCoordinateSystem gcs =
    srf.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);

    p1.SpatialReference = gcs;
    p2.SpatialReference = gcs;

    Debug.Print("Distance with spatialref {0}", GetDistance(p1, p2));
    Debug.Print("Great Circle Distance {0}", GreatCircleDist(p1, p2));

}
private double GetDistance(IPoint p1, IPoint p2)
{
    return ((IProximityOperator)p1).ReturnDistance(p2);
}

private double EuclidianDistance(IPoint p1, IPoint p2)
{
    return Math.Sqrt(Math.Pow((p2.X - p1.X),2.0) + Math.Pow((p2.Y - p1.Y), 2.0));
}

private double GreatCircleDist(IPoint p1, IPoint p2)
{
    ISpatialReferenceFactory srf = new SpatialReferenceEnvironmentClass();
    IProjectedCoordinateSystem pcs =
    srf.CreateProjectedCoordinateSystem((int)esriSRProjCSType.esriSRProjCS_WGS1984N_PoleAziEqui);
    pcs.set_CentralMeridian(true, p1.X);
    ((IProjectedCoordinateSystem2)pcs).LatitudeOfOrigin = p1.Y;
    p1.SpatialReference = pcs.GeographicCoordinateSystem;
    p1.Project(pcs);
    p2.SpatialReference = pcs.GeographicCoordinateSystem;
    p2.Project(pcs);
    return EuclidianDistance(p1, p2);
}

Aquí está el resultado:

Euclidian Distance 20
Distance with no spatialref 20
Distance with spatialref 20
Great Circle Distance 1965015.61318737

Creo que sería interesante poner a prueba esta en contra de la proyección del motor dll (pe.dll). Publicaremos los resultados si alguna vez voy a Richie que el código de trabajo.

Actualización: Una vez que he cambiado Richies código a compilar para x86, he conseguido que funcione. Interesante ... el gran círculo de la distancia que me da es 1960273.80162999 - una diferencia significativa desde que volvió de la azimutal equidistante método anterior.

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