У меня есть таблица почтовых индексов, которая включает в себя центральный лат, lng для каждого почтового индекса. Я использую его, чтобы получить список почтовых индексов в пределах определенного радиуса мили из любой произвольной точки.
Мне просто пришло в голову, что то, что центральная точка молнии не находится в пределах заданного радиуса, не означает, что сам почтовый индекс не находится в пределах радиуса.
Я использовал свои передовые художественные навыки, чтобы проиллюстрировать это:
Зеленые полосатые пятна представляют почтовые индексы A, B и C.
Красные пятна - это географические центры для каждого почтового индекса.
Точка фуксии - это целевое местоположение, и ..
Кусочек синего круга находится в радиусе 1 мили от цели
Если я выполню запрос для всех почтовых индексов в радиусе 1 мили от розового пятна, будут возвращены только почтовые индексы B и C, поскольку центральная точка для почтового индекса 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 . Как мне написать подобный запрос, который использует столбец геометрии вместо широты и долготы? Я использую 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
Я пока оставлю награду открытой на случай, если у кого-то найдется лучшее и более эффективное решение.