Tôi có một bảng mã zip bao gồm trung tâm lat, lng cho mỗi mã zip. Tôi sử dụng nó để lấy danh sách mã zip trong bán kính dặm cho trước từ bất kỳ điểm tùy ý nào.
Tôi nhận ra rằng, chỉ vì điểm trung tâm của zip không nằm trong bán kính nhất định, không có nghĩa là chính zip không nằm trong bán kính.
Tôi đã sử dụng các kỹ năng nghệ thuật siêu tiên tiến của mình để minh họa điểm ở đây:
Các đốm màu xanh lá cây đại diện cho mã zip A, B và C.
Các vết bẩn màu đỏ là trung tâm địa lý cho mỗi mã zip
Dấu chấm fuchsia là vị trí mục tiêu và ..
Vòng tròn màu xanh sần là bán kính 1 dặm từ vị trí mục tiêu
Nếu tôi chạy truy vấn cho tất cả các mã zip trong bán kính 1 dặm từ vết nhòe màu hồng, chỉ có mã zip B và C sẽ được trả về vì điểm trung tâm của zip A không nằm trong bán kính một dặm, mặc dù màu hồng tự làm nhòe rõ ràng là trong mã zip A.
SELECT *,
p.distance_unit
* DEGREES(ACOS(COS(RADIANS(p.latpoint))
* COS(RADIANS(z.y))
* COS(RADIANS(p.longpoint) - RADIANS(z.x))
+ SIN(RADIANS(p.latpoint))
* SIN(RADIANS(z.y)))) AS dist
FROM standard_zip AS z
JOIN ( /* these are the query parameters */
SELECT $lat AS latpoint, $lng AS longpoint,
$miles AS radius, 69 AS distance_unit
) AS p ON 1=1
WHERE z.y
BETWEEN p.latpoint - (p.radius / p.distance_unit)
AND p.latpoint + (p.radius / p.distance_unit)
AND z.x
BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
ORDER BY dist
Làm thế quái nào tôi viết một truy vấn sẽ bao gồm zip A trong kết quả?
Tôi có quyền truy cập vào không gian / hình học cho mỗi mã zip mà tôi có thể thêm vào bảng nếu cần, nhưng tôi không biết làm thế nào tôi sẽ sử dụng nó cho mục đích này trong MySQL.
Chỉnh sửa : Tôi đã dành một ngày để đọc tài liệu Oracle và MySQL cho dữ liệu không gian và quản lý để chuyển đổi thành công dữ liệu không gian của tôi sang MySQL . Làm cách nào để viết một truy vấn tương tự sử dụng cột hình học thay vì lat và long? Tôi đang sử dụng dữ liệu 2D .. hình học chỉ là đa giác và đa hình ..
Tôi nghĩ rằng tôi đã tìm ra nó ..
select
*
from
(
select
MIN(st_distance(geom, POINT(-82.765136, 28.0914015))) * 69 as miles,
zip
from
zip_spatial
group by
zip
order by
miles asc
) d
where
d.miles < 5
Bây giờ tôi sẽ để tiền thưởng mở trong trường hợp ai đó có giải pháp tốt hơn, hiệu quả hơn.