2010-02-16 18 views
7

Załóżmy, że mam tabelę 2 kolumny tak:Znajdź odległość między dwoma punktami w MYSQL. (Za pomocą punktu Typ danych)

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

Jak widać, jest to bardzo proste. utm jest typem danych Punkt. Wstawiam to tak:

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

Następnie tworzę indeks przestrzenny.

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

Dobrze, wszystko jest dobrze. Teraz chcę wybrać *, gdzie odległość < 99999. Ale to nie działa!

//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) 

Nawiasem mówiąc, próbowałem wstawić do bez PointFromWKB ... i to nie działa ... to dlaczego ktoś zasugerował, że PointFromWKB do mnie.

Odpowiedz

3

Rozwiązany. Oto co zrobiłem:

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

Czy oblicza się odległość na podstawie współrzędnych geograficznych lub współrzędnych planarnych. –

1

Możesz to zrobić w ten sposób. Nie jestem pewien, czy jest szybszy, czy nie.

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

O ile mi wiadomo, u trzeba spróbować drodze,

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

Więcej w this answer.

Powiązane problemy