Je travaille avec une pile ESRI, stockant mes couches dans une géodatabase sql-spatial-enabled-SDE (type Geometry, Web Mercator-3857).
Je crée une application de cartographie Web, donc par défaut, les tuiles sont également dans Web Mercator, 3857.
Via des procs stockés, j'utilise STDistance pour interroger les distances entre l'emplacement d'un utilisateur (coordonnées également dans Web Mercator) et les différentes couches.
Le problème est qu'en raison de la distorsion du web mercator, mes calculs de distance sont de plus en plus décalés, plus ils sont éloignés de l'équateur.
J'ai pensé à stocker mes calques en sql-spatial-geography (plutôt qu'en geometry), mais:
- J'imagine que mes requêtes de distance prendront beaucoup plus de temps (la distance calcule sur une surface sphérique)
- je devrai réimporter beaucoup de données
- les services arcgis ne seront pas aussi rapides qu'ils auront besoin de projeter à la volée
Si je vais sur Google Maps et que je fais un calcul de distance, la distance renvoyée est beaucoup plus précise, même dans les régions du nord / sud, donc je suppose que Google doit corriger la distorsion causée par la projection Web Mercator.
Ma question est donc la suivante: existe-t-il une valeur de facteur simple qui peut être appliquée aux calculs de distance effectués dans la projection Web Mercator pour obtenir la distance «correcte»?
la source
cos((l1 + l2)/2)
ce qui vous donnera la distance rhumb-line / constant course, plutôt qu'une distance grand cercle.Je considérerais votre deuxième option de stocker à nouveau vos données dans le
GEOGRAPHY
format si vous recherchez des résultats précis sur des données globales.Rien ne vous empêche d'avoir deux champs spatiaux dans une table - un dans Mercator en tant que
GEOMETRY
type et un dans WGS84 en tant queGEOGRAPHY
type (du moins pas dans SQL Server, je ne suis pas sûr d'ArcSDE).Vous devriez pouvoir créer un script de géotraitement simple qui remplira les deux champs avec vos données d'origine. S'il y a des modifications et des mises à jour fréquentes, cela peut ne pas être une option.
Une fois que vous avez les deux champs, vous pouvez continuer à utiliser votre Mercator pour un affichage rapide et convertir les points entrés par l'utilisateur en Lat / Lon pour les distances.
Cela présente deux avantages majeurs:
Les vitesses de requête seront plus complexes, mais elles peuvent être imperceptibles pour un utilisateur. Vous pouvez tester avec une classe d'entités avant de décider d'une solution. Vous devrez également convertir les points entrés par l'utilisateur depuis Mercator (ce qui devrait être trivial et pourrait être fait dans le navigateur).
Même avec le type géographique, il existe toujours une marge d'erreur:
Depuis MSDN
la source
Une autre suggestion d'ESRI consiste à utiliser un "service de géométrie", qui implique d'envoyer les géométries à un serveur ArcGIS et de renvoyer le résultat. Si vous ne vous attendez pas à des problèmes de goulot d'étranglement en utilisant un service Web, cela peut être une approche très efficace. J'ai utilisé la même approche dans une application Silverlight.
Voici une entrée de blog originale d'ESRI: http://blogs.esri.com/Dev/blogs/arcgisserver/archive/2010/03/05/Measuring-distances-and-areas-when-your-map-uses-the -Mercator-projection.aspx
Dans le blog, il y a un exemple JavaScript simplifié, et il y a aussi un exemple d'application complet ici: http://serverapps.esri.com/javascript_examples/compare_measurements.htm
la source
Comme le fait Google Earth, vous pouvez transformer la géométrie en projection de zone WGS84 locale ou en projection WGS84 améliorée comme SIRGAS en Amérique du Sud.
Vous pouvez rechercher dans http://www.spatialreference.org les coordonnées de presque toutes les projections "zonifiées", et vous pouvez créer un tableau, etc., pour les transformer en fonction de la zone.
On imagine une table zones
toutes les valeurs minx, miny, maxx, maxy stockées dans Spherical Mercator (Web Mercator). donc je vais utiliser postgis comme exemple.
J'espère que cela vous sera utile, passez une bonne journée.
la source
OpenLayers a une méthode utilitaire pour calculer la distance entre deux points EPSG: 4326 (WGS84) sur un ellipsoïde. Depuis OpenLayers est open source, vous pouvez voir comment il est mis en œuvre ici: https://github.com/openlayers/openlayers/blob/release-2.12/lib/OpenLayers/Util.js#L750
Pour ceux qui utilisent OpenLayers et le contrôle Measure, il suffit d'activer la géodésique dans les options littérales pour utiliser ce calcul.
la source