У меня есть таблица почтовых индексов, которая включает в себя центральный лат, 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
Я пока оставлю награду открытой на случай, если у кого-то найдется лучшее и более эффективное решение.
Любая попытка включить A, вероятно, будет включать D, E, F, G. Проблема не может быть решена без точного пути, определяющего каждую область почтового индекса.
Найдите такую базу данных, затем создайте
SPATIAL
индекс, используя такие произвольные многоугольники.источник
Ты делаешь это неправильно. Во-первых, если возможно, используйте PostGIS - ведущее решение RDMBS с пространственным решением.
Затем вы хотите выполнить следующие шаги.
shp2pgsql
Индексируйте геометрию, которую вы импортировали.
Выполните запрос точки интереса (POI) для шейп-файлов. В вашем случае интересным является входные шнуры, это будет выглядеть так,
09 1609,344 метра = 1 миля
MySQL
С MySQL у вас будет
Используйте
MBRIntersects
для использования пространственного индекса. Конечный запрос должен выглядеть примерно такисточник
ST_DWithin
сMBRIntersects
Проверьте этот набор данных от GreatData.com (обратите внимание, что это не открытый исходный код, а платный сервис).
Они используют плотность населения вместо центра молнии.
И как использовать SQL Server пространственный тип данных для быстрого получения правильных результатов.
Надеюсь это поможет.
источник