Как определить широту / долготу для многоугольника в postgis - PullRequest
0 голосов
/ 23 октября 2018

У меня есть список из 13000 мест (с широтой и долготой) --- в таблице: место.У меня есть список из 22000 полигонов ---- в другой таблице с именем place_polygon.Мне нужно попытаться разрешить поля для тех полигонов, к которым они принадлежат.

Это запрос, который я написал:

select * from stg_place.place a
left join stg_place.place_polygon b on 
ST_Within(ST_GeomFromText('SRID=4326;POINT('||a.longitude||' '||a.latitude||')'),b.geom);

также пытался:

select * from stg_place.place a
left join stg_place.place_polygon b on 
ST_Intersects(ST_GeomFromText('SRID=4326;POINT('||a.longitude||' '||a.latitude||')'),b.geom);

Это работает вечно.Но если я добавлю фильтр в запрос, он будет работать очень быстро для отдельной записи.

select * from stg_place.place a
left join stg_place.place_polygon b on 
ST_Within(ST_GeomFromText('SRID=4326;POINT('||a.longitude||' '||a.latitude||')'),b.geom)
where a.id = <id>;

Я также попытался написать хранимую процедуру и попытался перебрать курсор, чтобы выполнить только одну запись.вовремя.Это также не помогло.Программа работала всю ночь без признаков завершения.

Есть ли лучший способ решить эту проблему?(не обязательно в postgis, но в python geopy и т. д. ...?)

(Должен ли я рассмотреть индексацию таблиц?)

1 Ответ

0 голосов
/ 23 октября 2018

Прежде всего, используйте тип географии для ваших данных вместо длинных столбцов.Почему география, а не геометрия?Поскольку вы используете SRID = 4326 и с типом географии, вам будет намного проще, если вы хотите, например, рассчитать расстояние в метрах, а затем с типом геометрии, который будет рассчитываться в градусах для этого SRID.

Чтобы создать географию с вашим латомфункция использования длинного столбца st_setsrid(st_makepoint(long,lat),4326)::geography

Ok.Теперь, отвечая на ваш вопрос о вашей фактической структуре

У меня есть список из 13000 мест (с широтой и долготой) --- в таблице: место.У меня есть список из 22000 полигонов ---- в другой таблице с именем place_polygon.Мне нужно попытаться разрешить поляризацию для тех полигонов, которым они принадлежат.

Это запрос, который я написал:

select * 
  from stg_place.place a 
  left join stg_place.place_polygon b on 
   ST_DWithin (st_setsrid(st_make_point(long,lat),4326),b.geom,0);

Я использовал ST_DWithin () вместо ST_Within (), потому чтов более старой версии Postgres + PostGIS (наверняка 9.6 и ниже) он гарантирует использование пространственного индекса для geoms, если он создан.

...