Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jak zamienić kilometry na wspolrzedne geograficzne
Forum PHP.pl > Forum > PHP
webdeveloper
witam wszystkich!

Mam nadzieje, ze znajde tu pomoc, mam pewien problem do rozwiazania, otoz mam podane wspolrzedne geograficzne i chcialbym znalezc obiekty w promieniu X km od podanego punktu. Wiem jak oblicza sie odleglosci miedzy wspolrzednymi geograficznymi, ale niestety to mnie nie ratuje, poniewaz chcialbym poznac odwrotna metode - czyli zamienic kilometry na "wspolrzedne", o ile nie komplikuje sobie sprawy, to chcialbym zrobic cos takiego:
mam podane punkty x i y (szer. i dlug. geograficzna), zamieniam km na dane geograficzne (zx i zy) i pobieram obiekty o wspolrzednych zawierajacych sie w przedziale od x-z do x+z i y-zy i y+zy

bede wdzieczny za pomoc lub naprowadzenie, jak to inaczej obliczyc. Nie chce korzystac z obliczania odleglosci dla kazdych wspolrzednych geograficznych - optymalizacja
Fifi209
A o skali też musisz pomyśleć a nawet słowem o tym nie wspomniałeś.
flashdev
Nie wiem czy dobrze zrozumiałem problem.
Rozumiem że masz już napisany kawałek kodu, który na podstawie dwóch punktów oblicza najmniejszą odległość pomiędzy nimi.
A jeżeli chcesz zrobić to w drugą stronę w sensie:
function oblicz(1wspolrzedna, odleglosc){
...
return 2wspolrzedna;
}
To już niestety będzie problem, bo rozwiązaniem takiego równania może być:
- $wsp dla $odl = 0
- [zbiór współrzędnych położonych na okręgu] dla $ofl > 0
gdzie:
$wsp - to wejsciowa spółrzędna
$odl - to wejsciowa odległość
webdeveloper
@fifi209: czy chodzi Ci o skale ala 1:xxx? czy jakas inna skale? bo generalnie 10km to 10km, tylko ta odleglosc we wsporzednych bedzie sie roznic w zaleznosci od rownoleznikow (na rowniku jest najszerzej smile.gif)
@flashdev: generalnie, chce znalezc punkty, ktore beda zawieraly sie w odpowiednim zbiorze od -x do x (tak w uproszczeniu piszac smile.gif), byc moze szukam czegos, czego nie ma, ale nie wierze, zeby nie mozna bylo zamienic odleglosci na odpowiednie dane, nie chodzi o konkretne wspolrzedne, tylko o to, ze odcinek 10km na odpowiedniej dlugosci geograficznej wynosi tyle i tyle, tak jak na rowniku dlugosc rownika/360st =~ 111km, poludniki maja rowne dlugosci, wiec tu nie ma problemu
alegorn
odleglosc jest jednakowa czy to na na wysokosci rownika czy tez np.: zwrotnika raka. nalezy jedynie stosowac przelicznik krzywizny ziemi i bedzie git, to ze wizualnie jest roznica - to inna para kaloszy :]

problem jest dosc czesto spotykany, zwlaszcza gdy zaczynamy bawic sie z np.: google maps, rozwiazan znam kilka, i tak naprawde zaleza od tego czego oczekujesz.

dosc istotne dla twojego problemu jest ilosc obiektow.

jesli mialbys rozbudowana i dynamiczna baze obiektow , przeliczanie odleglosci miedzy nimi bylo bardzo nieefektywne z uwagi na ilosc dokonywanych przeliczen.

lepiej juz wstepnie zawezic zakres przeszukiwan, czyli jesli masz oznaczony pkt grograficzny - oznaczasz wartosci brzegowe, (wyznaczasz sobie kwadrat z wpisanym okregiem), pobierasz liste obiektow ktore odpowiadaja naszym warunkom brzegowym, i dopiero obiczasz odleglosci miedzy obiektami (czyli wywalasz to co zbedne)... zreszta, sposobow jest tyle co programistow... :]


kiedys popelnilem (z cztery lata temu, kiedy jeszcze tak napprawde sie uczylem fachu... zreszta, na dobra sprawe, nadal sie ucze :] ) projekt ktory robil cos takiego, podesle cie zebrane informacje na ten i podobne tematy( UWAGA aktualne na styczen 2008)



linki

http://code.google.com/apis/maps/
geokodowanie, geokodowanie a kody pocztowe
http://www.geonames.org/export
http://nieruchomosci.infor24.pl/lokalizator.php
spory zbior linkow na temat geokodowania:
http://groups.google.com/group/Google-Maps...oogle-geocoders
Reverse Geocoder Concepts
dodatkowe API http://nicogoeminne.googlepages.com/documentation.html
http://www.geonames.org/maps/reverse-geocoder.html
ciekawa stronka o google maps:
http://web4you.com.pl/
przyklad strony ktora wyszukuje okreslone lokalizacje w promieniu od zaznaczonego pkt.
http://twojafala.pl

  1.  
  2. //przydatne skrypty/funkcje
  3. //przeliczanie odleglosci miedzy dwoma pkt.(php)
  4. function distance($lat1, $lon1, $lat2, $lon2, $unit) {
  5. $theta = $lon1 - $lon2;
  6. $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1))* cos(deg2rad($lat2)) * cos(deg2rad($theta));
  7. $dist = acos($dist);
  8. $dist = rad2deg($dist);
  9. $miles = $dist * 60 * 1.1515;
  10. $unit = strtoupper($unit);
  11. if ($unit == "K") {
  12. return ($miles * 1.609344);
  13. } else if ($unit == "N") {
  14. return ($miles * 0.8684);
  15. } else {
  16. return $miles;
  17. }
  18. }#end function
  19. //echo distance(32.9697, -96.80322, 29.46786, -98.53506, "m") . " miles";
  20. //echo distance(32.9697, -96.80322, 29.46786, -98.53506, "k") . " kilometers";
  21. //echo distance(32.9697, -96.80322, 29.46786, -98.53506, "n") . " nautical miles";


  1. przykład kodu js do rysowania okręgu na mapie (w srodku )
  2. var lon = 29.46786;
  3. var lat = -98.53506;
  4. var zasieg = 50;
  5. var point = new GLatLng(lon,lat);
  6. var marker = new GMarker(point,ICONS[0]);
  7. map.addOverlay(marker);
  8. str = "";
  9. c=0;
  10. r= zasieg/111;
  11. var points = new Array();
  12. for (i=0;i<6.28;i=i+0.2){
  13. lat = eval(ar_2[0]);
  14. lon = eval(ar_2[1]);
  15. x = eval(lat + Math.cos(i)*r);
  16. y = eval(lon + Math.sin(i)*r/Math.cos(lat/57));
  17. points[c] = new GLatLng(x,y);
  18. ++c;
  19. }
  20. var polygon = new GPolygon(points, "#FFF000", 2, 0.6, "#FF0000", 0.4)// ,strokeOpacity, fillColor, fillOpacity);
  21. map.addOverlay(polygon);
webdeveloper
Dzieki @alegorn za pomoc! Przyjrze sie temu.
W "miedzyczasie" znalazlem ciekawe rozwiazanie: http://postgis.refractions.net/, w sumie to jest to, co potrzebuje, ale z pewnoscia przyjrze sie Twoim linkom.
Dzieki Panowie za pomoc!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.