2010-02-16 28 views
7

Giả sử tôi có một bảng 2 cột như thế này:Tìm khoảng cách giữa hai điểm trong MYSQL. (Sử dụng Point Datatype)

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

Như bạn có thể thấy, nó rất đơn giản. utm là Điểm loại dữ liệu. Tôi chèn nó như sau:

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

Sau đó, tôi tạo chỉ mục Không gian.

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

Được rồi, mọi thứ đều tốt. Bây giờ, tôi muốn chọn * trong đó khoảng cách < 99999. Nhưng nó không hoạt động!

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

Bằng cách này, tôi đã cố gắng để chèn vào mà không có sự PointFromWKB ... và nó đã không làm việc ... đó là lý do tại sao một ai đó gợi ý rằng PointFromWKB với tôi.

Trả lời

3

Đã giải quyết. Đây là những gì tôi đã làm:

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

Điều này có tính toán khoảng cách theo tọa độ địa lý hoặc tọa độ phẳng hay không. –

1

Bạn cũng có thể làm theo cách này. Không chắc nó có nhanh hơn hay không.

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

Theo như tôi biết, u phải cố gắng này gì theo cách

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

khác ở this answer.

Các vấn đề liên quan