Estoy trabajando con una pila ESRI, almacenando mis capas en una geodatabase sql-spaceial-enabled-SDE (tipo de geometría, Web Mercator-3857).
Estoy creando una aplicación de mapeo web, por lo que, por defecto, los mosaicos también están en web mercator, 3857.
A través de procesos almacenados, uso STDistance para consultar distancias desde la ubicación de un usuario (Coordenadas también en web mercator) a las diversas capas.
El problema es que, debido a la distorsión de web mercator, mis cálculos de distancia están cada vez más lejos, cuanto más lejos del ecuador se hacen.
He pensado en almacenar mis capas en el tipo sql-space-geography (en lugar de geometry), pero:
- Me imagino que mis consultas de distancia tomarán mucho más tiempo (la distancia se calcula en la superficie esférica)
- tendré que reimportar muchos datos
- Los servicios de ArcGIS no serán tan rápidos como necesitarán proyectar sobre la marcha
Si voy a los mapas de Google y hago un cálculo de distancia, la distancia devuelta es mucho más precisa, incluso en las regiones del norte / sur, por lo que supongo que Google debe estar corrigiendo la distorsión causada por la proyección web del vendedor.
Mi pregunta entonces: ¿Hay un valor de factor simple que se pueda aplicar a los cálculos de distancia realizados en la proyección web mercator para obtener la distancia "correcta"?
fuente
cos((l1 + l2)/2)
que le dará la distancia de rumbo constante / línea de rumbo, en lugar de una distancia de gran círculo.Consideraría su segunda opción de almacenar sus datos en el
GEOGRAPHY
formato nuevamente si está buscando resultados precisos en datos globales.No hay nada que le impida tener dos campos espaciales en una tabla: uno en Mercator como
GEOMETRY
tipo y otro en WGS84 comoGEOGRAPHY
tipo (al menos no en SQL Server, no estoy seguro acerca de ArcSDE).Debería poder crear una secuencia de comandos de geoprocesamiento simple que llene ambos campos con sus datos originales. Si hay edición y actualizaciones frecuentes en curso, entonces esta puede no ser una opción.
Una vez que tenga los dos campos, puede continuar usando su Mercator para una visualización rápida y convertir los puntos ingresados por el usuario a Lat / Lon para distancias.
Esto tiene dos ventajas principales:
Las velocidades de consulta serán más complejas, pero pueden pasar desapercibidas para un usuario. Es posible que desee probar con una clase de entidad antes de decidirse por una solución. También deberá convertir los puntos ingresados por el usuario desde Mercator (lo cual debería ser trivial y podría hacerse en el navegador).
Incluso con el tipo de geografía, aunque todavía hay un margen de error:
De MSDN
fuente
Una sugerencia alternativa de ESRI es utilizar un "servicio de geometría", que consiste en enviar las geometrías a un servidor ArcGIS y que se devuelva el resultado. Si no espera ningún problema de cuello de botella al usar un servicio web, este puede ser un enfoque muy efectivo. He usado el mismo enfoque en una aplicación Silverlight.
Aquí hay una entrada de blog original de ESRI: http://blogs.esri.com/Dev/blogs/arcgisserver/archive/2010/03/05/Measuring-distances-and-areas-when-your-map-uses-the -Mercator-projection.aspx
En el blog hay un ejemplo de JavaScript simplificado, y también hay una aplicación de ejemplo completa aquí: http://serverapps.esri.com/javascript_examples/compare_measurements.htm
fuente
Como lo hace Google Earth, podría transformar la geometría a la proyección de zona WGS84 local, o una proyección WGS84 mejorada como SIRGAS en América del Sur.
Puede buscar en http://www.spatialreference.org las coordenadas de casi todas las proyecciones "zonificadas", y puede hacer una tabla, etc., para transformarlas depende de la zona.
Imaginamos una mesa de zonas
Todos los valores minx, miny, maxx, maxy almacenados en Spherical Mercator (Web Mercator). entonces usaré postgis como ejemplo.
Espero que esto sea útil, que tengas un buen día.
fuente
OpenLayers tiene un método de utilidad para calcular la distancia entre dos puntos EPSG: 4326 (WGS84) en un elipsoide. Como OpenLayers es de código abierto, puedes ver cómo se implementa aquí: https://github.com/openlayers/openlayers/blob/release-2.12/lib/OpenLayers/Util.js#L750
Para aquellos que usan OpenLayers y el control Measure, solo habilite geodésico en las opciones literales para usar este cálculo.
fuente