Reverse Geocoding via Mysql

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Reverse Geocoding via Mysql

    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:

    PHP-Code:
    SELECT name,N,E,
    6378137*aCosSin(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_zipWHERE 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... :-)

  • #2
    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:
    Code:
    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;
    [FONT=monospace][/FONT][COLOR=#000000][COLOR=#006600]
    [/COLOR][/COLOR]

    Kommentar

    Lädt...
    X