Odległość między dwoma punktami na mapie

0

Posiadam kilka punktów, które opisują dwa parametry - szerokość i długość geograficzna podane w stopniach dziesiętnych. Chciałbym wyświetlić listę punktów, które są odległe ode mnie powiedzmy o 10 m lub mniej(moja lokalizacja również jest opisana przez długość i szerokość geograficzną). Wyliczam sobie po kolei odległości miedzy punktami i teraz pytanie, jak przeliczyć odcinek podany w stopniach dziesiętnych na metry? Chciałbym to zrobić jak najdokładniej, jakieś sugestie? Z góry dziękuję za rady ;)

0

To chyba takie proste nie będzie biorąc pod uwagę to, że Ziemia jest okrągła (więc odległości będą inne przy biegunach, inne przy równiku). Ale tu coś jest:
http://www.movable-type.co.uk/scripts/latlong.html
I https://www.google.pl/search?q=calculate+longitude+into+distance

1

Użyj Google API

0
Dawid586 napisał(a):

Posiadam kilka punktów, które opisują dwa parametry - szerokość i długość geograficzna podane w stopniach dziesiętnych. Chciałbym wyświetlić listę punktów, które są odległe ode mnie powiedzmy o 10 m lub mniej(moja lokalizacja również jest opisana przez długość i szerokość geograficzną). Wyliczam sobie po kolei odległości miedzy punktami i teraz pytanie, jak przeliczyć odcinek podany w stopniach dziesiętnych na metry? Chciałbym to zrobić jak najdokładniej, jakieś sugestie? Z góry dziękuję za rady ;)

Odległości na sferze, którą jest Ziemia - z niewielkim błędem, wyliczasz tak:
d = R * df

gdzie: R - promień, który wynosi średnio: 6370km,
df - kąt mierzony pomiędzy dwoma punktami na sferze, ale mierzony w radianach.

Z tego wyjdzie że dla dwóch punktów, dla których: df = 0.1 stopnia, otrzymasz odległość (po sferze, czyli po łuku, nie po linii prostej):
d = 0.1 * pi/180 * 6370km = 11.118 km

W przypadku położenia punktów we wsp. geogr. należy odpowiednio wyliczyć ten kąt df...
dla niedużych kątów będzie to zapewne w dobrym przybliżeniu zwyczajna suma kwadratów: df^2 = dszer-geo^2 + ddługość-geo^2, stąd df = ...

No, a dokładny wynik podają wzory z geometrii sferycznej.

0
LukeJL napisał(a):

To chyba takie proste nie będzie biorąc pod uwagę to, że Ziemia jest okrągła (więc odległości będą inne przy biegunach, inne przy równiku).

Przecież mowa o "10 metrach lub mniej". Kształt Ziemi tu jest bez znaczenia, a znacznie większe ma ukształtowanie terenu.
Ale do tego potrzebna byłaby dokładna mapa.
Chyba że chodzi o 10 metrów w rzucie pionowym, co będzie łatwe do określenia.

0
Azarien napisał(a):
LukeJL napisał(a):

To chyba takie proste nie będzie biorąc pod uwagę to, że Ziemia jest okrągła (więc odległości będą inne przy biegunach, inne przy równiku).

Przecież mowa o "10 metrach lub mniej". Kształt Ziemi tu jest bez znaczenia, a znacznie większe ma ukształtowanie terenu.
Ale do tego potrzebna byłaby dokładna mapa.
Chyba że chodzi o 10 metrów w rzucie pionowym, co będzie łatwe do określenia.

Słuszna uwaga. Czy faktycznie jest sens bawić się w wyliczenia biorące pod uwagę kształt ziemi jeśli mowa o odległościach nieprzekraczających powiedzmy 200 m? Pomijamy też ukształtowanie powierzchni. Dziękuję za tak liczne sugestie

0

Do liczenia dystansu pomiędzy 2 punktami sfery służą wzory na wielkie koło Ziemi: https://en.wikipedia.org/wiki/Great-circle_distance
Jeżeli sfera daje za małą dokładność (w praktyce przy dużych odległościach) to pozostaje zapoznać się z: https://en.wikipedia.org/wiki/Geographical_distance

1

algorytm 1 klasyczny:



		latitudeRad1 = Math.toRadians(latitudeGeo1);
		latitudeRad2 = Math.toRadians(latitudeGeo2);

		longitudeDelta = Math.toRadians(longitudeGeo2 - longitudeGeo1);
		latitudeDelta = Math.toRadians(latitudeGeo2 - latitudeGeo1);

		a = Math.sin(latitudeDelta / 2) * Math.sin(latitudeDelta / 2) + Math.cos(latitudeRad1) * Math.cos(latitudeRad2) * Math.sin(longitudeDelta / 2) * Math.sin(longitudeDelta / 2);
		cc = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

		return 6371 * cc;

algorytm 2 stuningowany:


p = 0.017453292519943295;
		a = 0.5 - Math.cos((latitudeGeo2 - latitudeGeo1) * p) / 2 + Math.cos(latitudeGeo1 * p) * Math.cos(latitudeGeo2 * p) * (1 - Math.cos((longitudeGeo2 - longitudeGeo1) * p)) / 2;

		return 12742 * Math.asin(Math.sqrt(a)); 
0

Do wyboru, do koloru. W zależności od potrzeb.
https://pubs.usgs.gov/pp/1395/report.pdf

1 użytkowników online, w tym zalogowanych: 0, gości: 1