Finden Sie den Abstand zwischen zwei Punkten in MYSQL. (Unter Verwendung des Punkt-Datentyp)

StackOverflow https://stackoverflow.com/questions/2270181

Frage

Angenommen, ich habe eine 2-Spalten-Tabelle wie folgt aus:

| user_id      | int(11) | NO   | UNI | NULL    |                |
| utm          | point   | NO   | MUL | NULL    |                |

Wie Sie sehen können, ist es sehr einfach. utm ist ein Punkt Datentyp. Ich lege es wie folgt aus:

INSERT INTO mytable(user_id, utm) VALUES(1, PointFromWKB(point(50, 50)));

Dann habe ich einen räumlichen Index erstellen.

ALTER TABLE mytable ...add spatial index on(utm) or something. (forgot)

In Ordnung, alles ist gut. Nun, ich will wählen * wo Abstand <99999. Aber es funktioniert nicht!

//This is supposed to select all where the distance is less than 99999999.
set @mypoint = PointFromWKB(point(20,20))
select * from mytable where GLength(LineString(utm, @mypoint)) < 9999999;
Empty set (0.00 sec)
select * from mytable where GLength(LineStringFromWKB(LineString(utm, @mypoint))) < 9999;
Empty set (0.00 sec)

Übrigens, ich habe ohne die PointFromWKB zu INSERT INTO versucht ... und es hat nicht funktioniert ... das ist, warum jemand, dass PointFromWKB mir vorgeschlagen.

War es hilfreich?

Lösung

Gelöst. Dies ist, was ich getan habe:

where GLength(LineStringFromWKB(LineString(asbinary(utm), asbinary(@mypoint)))) < 9999999999999;

Andere Tipps

Sie können es auch so machen. Nicht sicher, ob es schneller oder nicht.

select * from mytable where glength(geomfromtext(concat('linestring(', x(utm), ' ', y(utm), ',20 20', ')'))) < 99999999

Soweit ich weiß, u haben auf diese Weise versuchen -

select * from mytable
   where 
    (
        GLength(
          LineStringFromWKB(
            LineString(
              geoPoint, 
              GeomFromText('POINT(51.5177 -0.0968)')
            )
          )
        )
      ) < 99999999

Mehr in diese Antwort .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top