Shapely Polygons의 교차점으로 피처 계산


13

수백 개의 모양 과 기하학을 포함 하는 지오 팬더 GeoDataFrame 가 있습니다. 다각형은 많은 곳에서 겹칩니다. 중복되는 개수를 포함하는 새로운 형상을 만들고 싶습니다. 이 같은:PolygonMultiPolygon

중복 계산

누구든지 이것에 접근하는 방법에 대한 아이디어가 있습니까? 나는 심지어 길을 볼 수 없습니다.

결국 나는 폴리곤에 가중치를 부여하여 일부 폴리곤의 값이 2가 될 수 있기를 원합니다. shapely의 Z 필드로 이것을하는 것이 좋을 것입니다.

따로 : 나는이 라이브러리들 중 어느 것에도 특별히 묶여 있지 않습니다. 이 지오메트리의 좌표는 실제로 픽셀 좌표입니다. 래스터를 만들어 다른 이미지에 오버레이하는 데 어려움을 겪고 있습니다. 임의의 항목을 설치할 수없는 클라우드 서버 등에이 항목을 배포 할 수 있기 때문에 발자국을 최대한 작게 유지하고 싶습니다.


이 예제를 시도하십시오 . 각 일대일 교차점에 대한 다각형을 분할하고 각 인스턴스를 계산하고, 파이썬으로 목록을 만들어 카운트 번호와 속성 테이블로 채울 수 있습니다.
blu_sr

코드가 포함되어 있지 않지만 SO에 대한 답변은 한 다각형이 다른 다각형 내에 있는지 확인하는 알고리즘을 설명합니다. 선분 사이에 하나 이상의 선 교차점을 확인한 경우 겹치는 다각형을 나타내는 것으로 가정합니다.
stevej

또한 geopandas 함수 인 GeoSeries.intersects 가있는 것 같습니다 . 다각형에서 작동하는지 궁금합니다.
stevej

당신은 그들을 래스터 화 할 수있는 능력이 있습니까? 다각형에 다각형을 갖도록 모두 래스터 화하면 numpy를 사용하여 함께 추가 할 수 있으며 결과의 각 숫자는 해당 픽셀에서 얼마나 많은 다각형이 겹칠지를 나타냅니다.
user1269942

답변:


2

postgresql / postgis 솔루션이므로 주제가 아닐 수 있습니다.

postgres / postgis에서는 geopanda에 적용될 수있는 간단한 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

이 기준을 사용하면 다음과 같이 그룹별로 그룹을 통해 각 ID 객체의 개수를 집계 할 수 있습니다 .

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.