У меня есть таблица точек типа GEOGRAPHY
, назовите ее T_points
:
id point
1 POINT(-73.964736938476562, 40.7670783996582)
2 POINT(-73.962371826171875, 40.773128509521484)
3 POINT(-73.989463806152344, 40.767578125)
4 POINT(-73.978683471679688, 40.765167236328125)
...
и таблица многоугольников, также типа GEOGRAPHY
, назовите ее T_zones
:
id zone
1 POLYGON((-74.1856319999999 40.6916479999999, -74.185911 40.6914499999999, ... ))
3 POLYGON((-73.848596761 40.8716707849999, -73.849876452 40.8721018809999, ... ))
18 POLYGON((-73.8844286139999 40.8668003789999, -73.883625181 40.8672575879999, ... ))
20 POLYGON((-73.8839239579998 40.8644177609999, -73.883960024 40.8645497189999, ... ))
...
С помощью функции ST_COVERS
я могу узнать, находится ли точка X в зоне Y, по:
ST_COVERS(POLYGON((-73.8839239579998 40.8644177609999, -73.883960024 40.8645497189999, ... )),
POINT(-73.964736938476562, 40.7670783996582),
)
Эта функция возвращает TRUE
, если она в зоне и FALSE
если нет.
Цель : найти, в какой зоне находится каждая точка.
Как это сделать : для каждой точки в T_points
запустите этот ST_COVERS
с каждой зоной в T_zones
и верните T_zones.id
зоны, в которой находится точка.
Может ли кто-нибудь порекомендовать эффективный способ реализации этого?
Что-то например,
SELECT get_zone_id(point, T_zones.zones)
FROM T_points
было бы идеально, но я не знаю, как это сделать.
Идеальный результат:
id point zone_id
1 POINT(-73.964736938476562, 40.7670783996582) 1
2 POINT(-73.962371826171875, 40.773128509521484) 3
3 POINT(-73.989463806152344, 40.767578125) 24
4 POINT(-73.978683471679688, 40.765167236328125) 77
(значения zone_id
составлены)