PostGIS: определение соответствующего многоугольника в запросе, который включает в себя MultiPolygon - PullRequest
0 голосов
/ 07 октября 2018

Предположим, что в таблице есть географический столбец myGeoColumn, который содержит MultiPolygon следующим образом:

MULTIPOLYGON( ((-99 56,-52 18,-88 -27,-99 56))),((-77 56, 90 30, 92 36, -77 56)) )') 

Если я выдаю запрос, подобный этому:

SELECT * from myTable where ST_Intersection(myGeoColumn, ST_GeomFromText('POINT (-77 56)') is not null

, тогдазапрос завершается успешно, и я возвращаю строку - но я получаю также и весь MultiPolygon.Я не могу определить, какой полигон был сопоставлен.

Как улучшить запрос, чтобы он возвращал только фактический совпадающий многоугольник внутри MultiPolygon (в приведенном выше примере, многоугольник # 2)?Я считаю, что тот же вопрос применим, если столбец содержит GeometryCollection.

1 Ответ

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

вам нужно разбить мультиполигон перед выполнением st_intersection.

with polygon 
   as(select (st_dump(geom)).geom geom from mytable
      )    
select ST_Intersection(geom, ST_GeomFromText('POINT (-77 56)') from polygon

вы также пересекаете точку и многоугольник ... так что вам никогда не следует возвращать весь мультиполигон, как запрос, который вы предоставили.Это весь ваш запрос?

обновлено с тем, что вы думаете после

with polygon 
   as(select (st_dump(geom)).geom geom from mytable
      )    
select geom from polygon where st_intersects(geom, ST_GeomFromText('POINT (-77 56)')

Обновление 2

На основев вашем комментарии это может быть другой способ сделать это

with 
  polygon_inter as(select (ST_Dump(geom)).geom geom 
                     from mytable 
                     where ST_Intersects(geom,ST_GeomFromText('POINT (-77 56)')
  )
select geom from polygon_inter 
 where ST_Intersects(geom,ST_GeomFromText('POINT (-77 56)')

1-й CTE будет только выбирать и разбивать мультиполигон, который пересекает точку (это устраняет страх перед оптимизацией разбить ВСЕ мультиполигоны), тогдаselect после cte выберет только ИНДИВИДУАЛЬНЫЕ многоугольники, которые пересекают точку

...