Shapely Polygonsの交差点へのフィーチャのカウント


13

私が持っているgeopandas GeoDataFrame見栄えの何百も含むPolygonMultiPolygonジオメトリを。ポリゴンは多くの場所で重なります。重複する数のカウントを含む新しいジオメトリを作成したいと思います。このようなもの:

重複のカウント

誰もこれにアプローチする方法についてのアイデアを持っていますか?道すら見えない。

最終的には、いくつかのポリゴンが単独で2の価値があるように、ポリゴンに重みを付けることができるようになりたいと思います。これをshapelyのZフィールドで行うといいかもしれません。

余談:私はこれらのライブラリのどれにも特に縛られていませんが、まさに私が終わったところです。これらのジオメトリの座標は実際にはピクセル座標です—別の画像にオーバーレイするラスターを作成することにつまずいています。ランダムなものをインストールできないかもしれないクラウドサーバーなどにこのようなものを展開できるようにしたいので、フットプリントをできる限り小さくしたいと思います。


この例を試してください。1対1の各交差点でポリゴンを分割し、各インスタンスをカウントし、Pythonでリストを作成して、カウント数と属性テーブルを入力できます。
blu_sr

コードは含まれていませんが、SOに関するこの回答では、あるポリゴンが完全に別のポリゴン内にあるかどうかをチェックするアルゴリズムについて説明しています。線分セグメント間の少なくとも1つの線分交差をチェックすると、ポリゴンの重なりを示していると思います。
-stevej

また、geopandas関数GeoSeries.intersectsがあるようです。ポリゴンで機能するのだろうか。
-stevej

それらをラスタライズする機能はありますか?それらすべてをポリゴンにラスタライズする場合、numpyを使用してそれらを一緒に追加できます。結果の各数値は、そのピクセルで重複するポリゴンの数を示します。
-user1269942

回答:


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

これに基づいて、group by Clauseを介して各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.