Frage

In meiner DB i einen Mittelpunkt zu speichern, zusammen mit einem Radius (in Metern).

Ich bin auf der Suche in einem lat / lng passieren, und dann die auf mysql Werte i gespeichert haben einen Kreis zu schaffen, mir zu sagen, wenn mein Punkt i in innerhalb dieses Kreises ist vergangen. Gibt es etwas, das mir erlauben würde dies, ähnlich wie die Haversine forumla zu tun (die, dass mein Punkt in der db war schon annehmen würden).

Haversine Formel:  (3959 * acos (cos (Radiant (40)) * cos (Radiant (lat)) * cos (Radiant (long) - Radiant (-110)) + sin (Radiant (40)) * sin (Radiant (long)) )

db:

circleLatCenter, circleLngCenter, Radius

vorbei in> select id aus foo wo lat, lng in (make Kreisfunktion: circleLat, circleLng, Radius)

War es hilfreich?

Lösung

MySQL hat eine ganze Reihe von räumlichen Daten Funktionen:

Räumliche Erweiterungen zu MySQL

Ich denke, der Abschnitt werden die Beziehungen zwischen Geometrien auf der Messung ist, was Sie nach:

Beziehungen zwischen Geometrien

Andere Tipps

Ich habe durch die Berechnung des Begrenzungsrahmen über Großkreisentfernung ähnliche geographische Suche gemacht und die Datenbank für die Abfrage. Sie müssen noch einen weiteren Durchgang in der Anwendung „um die Ecken“ von Box zu Kreis begrenzt.

So, da eine Datenbank von Punkten, ein Suchpunkt (X, Y) und einem Abstand D, finden Sie alle Punkte innerhalb D von (X, Y):

  1. Compute deltaX, welches der Punkt ist, wenn Sie Abstand D entlang der Y-Achse bewegt werden.
  2. Compute deltaY, welches der Punkt ist, wenn Sie Abstand D entlang der X-Achse bewegt wird.
  3. Berechnen Sie Ihren Begrenzungsrahmen: (X-deltaX, Y-deltaY), (X + deltaX, Y + deltaY)
  4. Abfrage-Datenbank Punkte verwenden SQL Operator BETWEEN: SELECT * FROM TABELLE WHERE X zwischen X-deltaX UND X + deltaX und Y zwischen Y-deltaY und Y + deltaY
  5. Post-Prozess der Liste der Punkte zurück, die tatsächliche Großkreisentfernung Berechnung, die Punkte an den Ecken des Platzes zu entfernen, die nicht in Ihrem Abstand Kreis sind.

Als Kurzschnitt, ich Grad-per-Meile der Regel berechnen für beide lat und lon (am Äquator, da der Grad-per-Meile an den Polen für lon unterschiedlich ist), und leiten deltaX und deltaY als ( D * Grad-lat-per-Meile) oder Grad-lon-per-Meile. Die Differenz am Äquator vs Pol spielt keine große Rolle, da ich bereits tatsächliche Entfernung nach der SQL-Abfrage berechnet wird.

FYI - 0.167469 zu 0.014564 Grad-lon-per-Meile und 0.014483 Grad-lat-per-Meile

Ich weiß, dass dies eine lange tote Post, aber, falls jemand jemals über diese komme, brauchen Sie nicht eine „reverse Haversine Formel“ überhaupt zu schaffen. Die Haversine Formel gibt den Abstand zwischen Punkt A und Punkt b. Sie müssen den Abstand zwischen dem Punkt b und dem Punkt a, für die Berechnung ein. Dies sind der gleiche Wert.

SELECT *, 
( 3959 * acos( cos( radians(40) ) * cos( radians( `circleLatCenter` ) ) * cos( radians( `circleLngCenter` ) - radians(-110) ) + sin( radians(40) ) * sin( radians( `circleLngCenter` ) ) ) as `haversine` 
FROM `table` WHERE 1=1 
HAVING `haversine` < `Radius`
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top