Для каждой строки таблицы запускается функция с каждой строкой другой таблицы - PullRequest
0 голосов
/ 07 августа 2020

У меня есть таблица точек типа 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 составлены)

1 Ответ

1 голос
/ 07 августа 2020

Вы можете попробовать следующий способ -

SELECT id, point, zone_id
FROM T_points 
JOIN T_zones ON ST_WITHIN(point, zone)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...