Підрахунок особливостей до перетинів багатокутних фігур


13

У мене є геопанди, GeoDataFrame що містять сотні фігурнихPolygon та MultiPolygonгеометрій. Багатокутники перекриваються в багатьох місцях. Я хотів би скласти нову геометрію, яка містить підрахунок кількості перекриттів. Щось на зразок цього:

Підрахунок перекриттів

Хтось має ідеї, як підійти до цього? Я навіть не можу побачити вихід.

Врешті-решт, я особливо хотів би мати можливість зважувати багатокутники, щоб деякі полігони могли коштувати 2 самостійно. Зробити це з shapelyполем 's Z може бути непогано.

Убік: я не особливо прив’язаний до жодної з цих бібліотек, я просто там опинився. Координати в цих геометріях насправді є піксельними координатами - я натрапляю на те, щоб зробити растр для накладання іншого зображення. Я вважаю за краще зберігати слід якомога менше, оскільки я хотів би мати можливість розгорнути цей матеріал на хмарних серверах тощо, де я не зможу встановити випадкові речі.


Спробуйте цей приклад . Ви можете розділити багатокутники для кожного перетину 1 на 1 та порахувати кожен екземпляр, скласти список у python для заповнення чисельним числом, а потім таблицю атрибутів.
blu_sr

Поки немає коду, але ця відповідь на SO описує алгоритм, щоб перевірити, чи повністю один многокутник знаходиться в межах іншого. Я припускаю, що якби ви перевірили наявність хоча б одного перетину ліній між сегментами лінії, то це означало б перекриття полігонів.
stevej

Також, здається, існує функція Geopandas GeoSeries.intersects ; Цікаво, чи працює на багатокутниках.
stevej

чи маєте ви змогу їх растеризувати? якщо ви растровуєте їх усіх, щоб вони були у полігонах, ви можете використовувати numpy, щоб додати їх разом, і кожне число в результаті буде вказувати, скільки полігонів перекриваються на цьому пікселі.
користувач1269942

Відповіді:


2

Може бути поза темою, оскільки це рішення postgresql / postgis:

У postgres / postgis це простий запит O (N ^ 2), який може / може бути прийнятий до геопандам.

$ psql gis_se;
-- create the postgis extension  
create extension postgis;

-- create a polygon table 
create table test_overlap(id serial primary key);

-- Add the geometry
select addgeometrycolumn('public','test_overlap','geom',4326,'POLYGON',2);
insert into test_overlap(geom) values
(ST_GeomFromEWKT('SRID=4326;POLYGON((-2 -2, -2 -1,-1 -1,-1 -2, -2 -2))')),
(ST_GeomFromEWKT('SRID=4326;POLYGON((-2 -2, -2 0, 0 0, 0 -2, -2 -2))')),
(ST_GeomFromEWKT('SRID=4326;POLYGON((2 2, 2 0, 0 0, 0 2, 2 2))')),
(ST_GeomFromEWKT('SRID=4326;POLYGON((2 2, 2 1,1 1,1 2, 2 2))')),
(ST_GeomFromEWKT('SRID=4326;POLYGON((-1.5 -1.5, -1.5 1.5,1.5 1.5,1.5 -1.5, -1.5 -1.5))'));

і визначає 5 прямокутників:

введіть тут опис зображення

Запит на перехрестя із самою таблицею:

select a.id, b.id, st_intersects(a.geom, b.geom) 
from test_overlap as a, test_overlap as b 
where a.id<>b.id; 

показує, які ділянки перетинаються:

 id | id | st_intersects 
----+----+---------------
  1 |  2 | t
  1 |  3 | f
  1 |  4 | f
  1 |  5 | t
  2 |  1 | t
  2 |  3 | t
  2 |  4 | f
  2 |  5 | t
  3 |  1 | f
  3 |  2 | t
  3 |  4 | t
  3 |  5 | t
  4 |  1 | f
  4 |  2 | f
  4 |  3 | t
  4 |  5 | t
  5 |  1 | t
  5 |  2 | t
  5 |  3 | t
  5 |  4 | t

Використовуючи цю основу, ви можете агрегувати підрахунки для кожного об’єкта ідентифікатора через групу за допомогою пункту:

select id, count(id)                         
from (select 
       a.id as id, b.id as bid, 
       st_intersects(a.geom, b.geom) as intersects 
       from test_overlap as a, test_overlap as b where a.id<>b.id
) as i
where intersects
group by id
order by id;

Результат показує шукану схему.

 id | count 
----+-------
  1 |     2
  2 |     3
  3 |     3
  4 |     2
  5 |     4
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.