Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Reverse Geocoding via Mysql [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Reverse Geocoding via Mysql


 
fit4tv
28-06-2010, 10:40 
 
Tag Zusammen,

bin gerade dabei die Funktion "Find nearby place" unzusetzen. Ich habe dafür eine Mysql Datenbank mit Namen der Städte und dessen Koordinaten.

Das habe ich wie folgt in Mysql ungesetzt:


SELECT name,N,E,
6378137*aCos( Sin(N/180*pi())*Sin($N/180*pi()) + Cos(N/180*pi())*Cos($N/180*pi())*Cos($E/180*pi()-E/180*pi())) AS km
FROM `geo_zip` WHERE 1
GROUP BY name,N,E
ORDER BY km ASC LIMIT 1;


Für alle die das Statement nicht verstehen: Ich berechne die Entfernung zwischen meinen gesuchten Koordinaten und "JEDEM" ort der sich in der Datenbank befindet. Dann nehme ich den Ort mit der kürzesten entfernung.

Dies funktioniert bereits einwandfrei.

meine frage ist, ob es nicht einen besseren weg gibt oder ein besseres statement, denn das auflösen von allen entfernungen dauert seine zeit.
Ich habe das mit 2 datenbanken getestet. Die eine hat 180.000 datensätze die andere 8.000. Die größe braucht ca. 15sec. für die abfrage, die kleine ca. 300ms.

Ich würde das gerne beschleunigen, daher hat jemand verbesserungsvorschläge ?

Für jeden hinweis bin ich sehr dankbar... :-)

 
onemorenerd
28-06-2010, 12:23 
 
Da Cos(N/180*pi()) nur von N abhängt, kannst du es vorberechnen und in einer Spalte neben N speichern; andere Werte ebenfalls.
Vielleicht wirds auch schneller, wenn du 180*pi() vorher berechnest.
Die Query könnte dann so aussehen:
SELECT name,N,E,
6378137 * aCosOfSinOfN * Sin($N/pi180) + CosOfN *Cos($N/pi180) * Cos($E/pi180 - E/pi180)) AS km
FROM `geo_zip`
GROUP BY name,N,E
ORDER BY km ASC LIMIT 1;

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:55 Uhr.