我有一个邮政编码表,其中包括每个邮政编码的中心纬度,经度。我用它来获取从任意点到给定英里半径内的邮政编码列表。
在我看来,仅仅是因为拉链的中心点不在给定的半径内,并不意味着拉链本身不在半径内。
我用自己的超高级艺术技巧来说明这一点:
绿色条纹斑点表示邮政编码A,B和C。
红色污点是每个邮政编码的地理中心
紫红色的点是目标位置,并且..
块状蓝色圆圈距离目标位置1英里半径
如果我查询距离粉红色污迹1英里半径内的所有邮政编码,则将返回邮政编码B和C,因为邮政编码A的中心点不在1英里半径内,即使粉红色污迹本身显然在邮政编码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
如何编写一个在结果中包含zip A的查询?
我可以访问需要添加到表中的每个邮政编码的空间/几何,但是我不知道如何在MySQL中将其用于此目的。
编辑:我花了一天的时间阅读Oracle和MySQL文档中的空间数据,并成功地将空间数据转换为MySQL。如何编写类似的查询,该查询使用geometry列而不是lat和long?我正在使用2D数据..几何仅是多边形和多多边形。
我想我已经解决了。
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
如果有人有更好,更有效的解决方案,我现在将悬赏金打开。