Zliczanie elementów na przecięciach kształtnych wielokątów

13

Mam geopandy GeoDataFrame zawierające setki zgrabnychPolygon i MultiPolygongeometrycznych kształtów. Wieloboki zachodzą na siebie w wielu miejscach. Chciałbym stworzyć nową geometrię, która zawiera liczbę nakładających się na siebie. Coś takiego:

Liczenie nakładają się

Czy ktoś ma jakieś pomysły, jak do tego podejść? Nie widzę nawet wejścia.

W końcu szczególnie chciałbym móc zważyć wielokąty, aby niektóre wielokąty były warte 2 same. Robienie tego z shapelypolem Z może być fajne.

Poza tym: nie jestem szczególnie przywiązany do żadnej z tych bibliotek, właśnie tam skończyłem. Współrzędne w tych geometriach są w rzeczywistości współrzędnymi pikseli - staram się tworzyć rastry, aby nakładały się na inny obraz. Wolałbym, aby mój ślad był jak najmniejszy, ponieważ chciałbym móc wdrożyć te rzeczy na serwerach w chmurze itp., Gdzie może nie być w stanie zainstalować losowych rzeczy.

kwinkunks
źródło
Wypróbuj ten przykład . Możesz podzielić wielokąty dla każdego skrzyżowania 1 do 1 i policzyć każde wystąpienie, utworzyć listę w pythonie, aby wypełnić liczbę zliczeń, a następnie tabelę atrybutów.
blu_sr,
Chociaż nie ma kodu, ale ta odpowiedź na SO opisuje algorytm sprawdzający, czy jeden wielokąt jest całkowicie w innym. Zakładam, że jeśli sprawdziłeś co najmniej jedno przecięcie linii między segmentami linii, oznaczałoby to nakładające się wielokąty.
stevej
Wydaje się również, że istnieje funkcja geopandasowa GeoSeries.intersects ; Zastanawiam się, czy to działa na wielokątach.
stevej
czy potrafisz je zrasteryzować? jeśli zrasteryzujesz je wszystkie, aby mieć je w wielokątach, możesz następnie użyć numpy, aby je dodać, a każda liczba w wyniku wskaże, ile wielokątów zachodzi na ten piksel.
user1269942,

Odpowiedzi:

2

Może być nie na temat, ponieważ jest to rozwiązanie postgresql / postgis:

W postgres / postgis jest to proste zapytanie O (N ^ 2), które można / można zaadaptować do geopandy.

$ 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))'));

i definiuje 5 prostokątów:

wprowadź opis zdjęcia tutaj

Żądanie przecięcia z samą tabelą:

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; 

pokazuje, które obszary się przecinają:

 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

Korzystając z tej podstawy, można agregować liczby dla każdego obiektu identyfikatora za pośrednictwem grupy według Clausel:

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;

Wynik pokazuje pożądany wzór.

 id | count 
----+-------
  1 |     2
  2 |     3
  3 |     3
  4 |     2
  5 |     4
huckfinn
źródło