Utilisation de mesures géodésiques pour les rayons circulaires?

15

Je développe actuellement un site de cartographie OpenLayers. Les mesures peuvent être effectuées à l'aide d'un outil de ligne et d'un outil de zone. Ces deux paramètres sont actuellement définis pour calculer les mesures géodésiques comme indiqué dans l' API OpenLayers .

J'utilise des mesures géodésiques plutôt que des mesures planes car lors des tests utilisateurs, les gens ont remis en question les mesures de l'outil pour des distances qu'ils connaissaient déjà (comme la conduite entre les villes).

Une nouvelle fonctionnalité du site est de permettre à un utilisateur de dessiner un cercle sur la carte d'un rayon défini. OpenLayers permet uniquement de dessiner des cercles en utilisant des distances planes. Ainsi, lorsqu'un utilisateur mesure le cercle avec l'outil de mesure géodésique, les valeurs ne correspondent pas. Dans l'image ci-dessous, le rayon plan du cercle est de 10 km, mais la mesure de la ligne géodésique pour le diamètre est de 12 km.

De toute évidence, cela laissera un utilisateur (et moi-même) se demander ce qui est correct.

texte alternatif

En regardant cette réponse, il semble que la plupart des systèmes SIG de bureau "ignorent" ce problème et renvoient des mesures et des distances planes. Quelle est donc la meilleure pratique en termes d'interface utilisateur et de précision pour gérer les mesures planaires et géodésiques?

Mise à jour

J'ai trouvé cet exemple Google qui illustre le problème des rayons et de la projection Mercator:

http://maps.forum.nu/gm_sensitive_circle2.html

Le code JavaScript pour dessiner le cercle est le suivant:

    var lat1 = (PI/180)* center.lat(); // radians
    var lng1 = (PI/180)* center.lng(); // radians

    for (var a = 0 ; a < 361 ; a++ ) {
        var tc = (PI/180)*a;
        var y = asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc));
        var dlng = atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y));
        var x = ((lng1-dlng+PI) % (2*PI)) - PI ; // MOD function
        var point = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI)));
        circlePoints.push(point);
        bounds.extend(point);
    }

Ce cercle tient-il compte de la courbure de la terre?

Mise à jour finale

Code de travail publié sur http://geographika.co.uk/creating-a-geodesic-circle-in-openlayers

geographika
la source
1
quelque chose doit mal se passer ici. la différence ne peut pas être de 20% sur une distance aussi courte entre la ligne droite et la ligne suivant le sphéroïde. autre chose doit être impliqué.
Nicklas Avén
4
La projection est très probablement Mercator, qui n'a que la vraie échelle à l'équateur (généralement, il est en fait possible d'avoir des projections de Mercator avec la vraie échelle ailleurs (à une seule latitude), mais la plupart des paramétrisations globales utilisent l'équateur). Et les erreurs d'échelle pour Mercator sont en effet très élevées (infinies, en fait, aux pôles) et augmentent lorsque vous vous dirigez vers le nord / sud à partir de la véritable latitude d'échelle.
Paul Ramsey
Les mesures ont été prises à 52 degrés nord et sont en effet dans la projection de Mercator. Cela signifie-t-il que toutes les fonctionnalités côté client dessinées dans Mercator renverront des zones et des longueurs très imprécises à moins qu'elles ne soient proches de l'équateur?
geographika
1
Oui, c'est à peu près le cas, projetez les données sur une grille locale en mètres ou en pieds et tout ira bien.
Ian Turton
2
@Paul Bon appel. Mais ces données indiquent seulement que la projection est cylindrique, dont le Mercator est un. Dans les projections véritablement cylindriques, la distorsion horizontale est égale à la sec (latitude). Par cette formule, la distorsion de 20 / 12,13 correspond à une latitude de 52,66 degrés; c'est exactement la latitude de Limerick.
whuber

Réponses:

8

Si vous êtes à la maison dans le navigateur, vous pouvez obtenir un "cercle" (il ne sera pas rond à l'écran en raison de votre projection; plutôt approximé par un polygone avec autant de points que vous souhaitez dessiner), utilisez a la forme directe des calculs géodésiques: étant donné un point, une direction (azimut) et une distance, il vous donne le point résultant. Détails sanglants: http://en.wikipedia.org/wiki/Vincenty%27s_formulae#Direct_Method

On dirait que quelqu'un a déjà fait une traduction en javascript: http://www.movable-type.co.uk/scripts/latlong-vincenty-direct.html . Quel chanceux êtes-vous!

Pour finir les choses:

  • Décidez de la grosseur (nombre de sommets, appelez-le n) que vous souhaitez que le résultat final soit.
  • Divisez 360 degrés en n morceaux.
  • Construire un polygone par (pour i dans la plage (n): polygon.add (vincenty_direct (start_point, i * 360 / n, distance))))
  • Après coup, corrigez éventuellement certaines irritations de projection et de planarisation:
    • Si vous utilisez la projection de carte Web typique, ce que vous êtes presque certainement, le polygone résultant sera énormément étiré verticalement s'il s'approche d'un pôle.
    • De même, si le polygone de résultat traverse la ligne de date internationale, il sera vraiment bouché.

À votre santé!

Dan S.
la source
1
La méthode Vincenty a déjà été ajoutée à OpenLayers dans l'espace de noms utils - dev.openlayers.org/apidocs/files/OpenLayers/… avec ceci et votre explication, en particulier le paramètre de roulement, clarifiez cela. Merci!
geographika
:) Faites-moi savoir à quel point les «irritations» sont irritantes. Idéalement, la réparation ferait déjà partie d'OpenLayers et cela fonctionnerait, mais je ne suis pas sûr.
Dan S.
3

OpenLayers permet uniquement de dessiner des cercles en utilisant des distances planes

Pour obtenir un cercle géodésique, vous pouvez utiliser l' opération de tampon dans le service de géométrie d'ESRI.

... si l'unité est linéaire comme les pieds ou les mètres, un tampon géodésique est effectué

Un document librement accessible est disponible ici .

Kirk Kuykendall
la source
Merci pour le lien utile - je vais voir si je peux appeler le service et mettre à jour la fonctionnalité en JavaScript. Ma seule préoccupation serait de me fier à un service Web qui pourrait être désactivé à tout moment. Je suppose que le point tampon géodésique serait le cercle précis / réel de 10 km?
geographika
Le cercle doit être précis, cependant, je le vérifierais en utilisant votre outil de mesure. Je pense que le service de géométrie fait partie d'une installation de serveur arcgis standard, donc si celui-ci est retiré, il devrait y en avoir beaucoup plus sur le Web. google.com/…
Kirk Kuykendall