Suite

Calculer le relèvement d'un MapPoint à un autre MapPoint


J'utilise le package Esri.ArcGISRuntime dans un programme C# que nous écrivons.

Je dois créer des formes spécifiques à partir d'un point de référence et les projeter dans différentes directions. C'est facile de créer un nouveau point à 5 000 m avec un relèvement à 45 degrés. c'est à dire

var startPoint = new MapPoint(125.4, -33.2, SpatialReferences.Wgs84); var endPoint = GeometryEngine.GeodesicMove(startPoint, 5000, LinearUnits.Meters, 45);

Plus tard, lorsque j'aurai besoin de désosser les points, je peux facilement recalculer la distance entre ces points en utilisant

var distance = GeometryEngine.GeodesicDistance(startPoint, endPoint, LinearUnits.Meters);

Cependant, je ne peux pas trouver de toute façon pour déterminer quel était l'angle ou le relèvement d'origine entre ces 2 points.

J'ai essayé d'utiliser Arctan2, mais les coordonnées MapPoint sont faussées par la courbure de la terre (je pense) et donc le calcul direct est incorrect.

var degrés = Math.Atan2(endPoint.Y - startPoint.Y, endPoint.X - startPoint.X) / Math.Pi * 180 ;

Ce qui précède renvoie un chiffre d'environ 39 degrés (PS, j'ai également essayé de changer X et Y, pas mieux).


Prenez 39 comme première estimation, 29 comme limite basse, 49 comme limite haute. Essayez de minimiser la distance entre le point final connu et le nouveau point final à un relèvement donné en utilisant la 1ère équation, voyez comment fonctionne la section dorée https://en.wikipedia.org/wiki/Golden_section_search

Mise à jour sur la réponse originale Je n'ai pas C# etc, c'est donc une solution utilisant arcpy

importer arcpy, traceback, os, sys, math from arcpy importer env env.overwriteOutput = True tbl=r"d:/scratch/excel.dbf" line=r"D:/Scratch/theLine.shp" g=arcpy.Geometry () gr=(math.sqrt(5)-1)/2 def gss(a,b,tol): c=b-gr*(ba) d=a+gr*(ba) tandis que abs(cd)> tol: fc=f(c);fd=f(d) si fc

Résultat:


Utilisez l'interface .NET vers GeographicLib. Ceci est appelable à partir de C# et la méthode Geodesic::Inverse vous permet de calculer la distance et le relèvement en fonction de deux points.


Étonnamment, l'un des autres gars de l'entreprise avait besoin de la même chose sur un projet complètement différent en javascript.

Sa réponse est d'utiliser la méthode inverse de Vincenty. Il existe quelques implémentations autour:

javascript - http://www.movable-type.co.uk/scripts/latlong-vincenty.html faites défiler jusqu'en bas.

C# - http://www.codeproject.com/Articles/19939/GPS-Receivers-Geodesy-and-Geocaching-Vincenty-s-Fo

Il existe également un site de validation du gouvernement australien afin de vérifier vos résultats http://www.ga.gov.au/geodesy/datums/vincenty_inverse.jsp


Voir la vidéo: Microsoft MapPoint Best Alternative 2020 (Octobre 2021).