Özellikleri Düzgün Çokgenlerin kesişimlerine sayma


13

Yüzlerce şekil ve geometri içeren bir jetondadam var . Çokgenler birçok yerde çakışıyor. Kaç tanesinin çakıştığını içeren yeni bir geometri yapmak istiyorum. Bunun gibi bir şey:GeoDataFramePolygonMultiPolygon

Çakışmaları sayma

Buna nasıl yaklaşılacağı konusunda herhangi bir fikri olan var mı? Bir yolu bile göremiyorum.

Sonunda özellikle çokgenleri ağırlıklandırmak istiyorum, böylece bazı çokgenler kendi başlarına 2 değerinde olabilir. Bunu shapelyZ alanının ile yapmak güzel olabilir.

Kenara: Bu kütüphanelerden herhangi birine özellikle bağlı değilim, tam da burada olduğum yer. Bu geometrilerdeki koordinatlar aslında piksel koordinatlarıdır - başka bir görüntünün üzerine bindirmek için bir raster oluşturmaya çalışıyorum. Bu alanı rastgele sunucuları yükleyemeyeceğim bulut sunucularına, vb. Dağıtabilmek istediğimden, ayak izimi olabildiğince küçük tutmayı tercih ederim.


Bu örneği deneyin . Her bire bir kavşak için çokgenleri bölebilir ve her örneği sayabilir, sayım numarası ve sonra öznitelik tablosu ile doldurmak için python'da bir liste oluşturabilirsiniz.
blu_sr

Kod dahil edilmese de, SO'daki bu cevap, bir çokgenin tamamen diğerinin içinde olup olmadığını kontrol etmek için bir algoritmayı açıklar. Çizgi segmentleri arasında en az bir çizgi kesişimini kontrol ettiyseniz, bunun çakışan çokgenleri göstereceğini varsayıyorum.
stevej

Ayrıca geopandas işlevi var gibi görünüyor GeoSeries.intersects ; Çokgenler üzerinde çalışıp çalışmadığını merak ediyorum.
stevej

onları rasterleştirme yeteneğiniz var mı? hepsini çokgenlerde olacak şekilde rasterleştirirseniz, bunları eklemek için numpy kullanabilirsiniz ve sonuçtaki her sayı o pikselde kaç çokgenin çakıştığını gösterecektir.
user1269942

Yanıtlar:


2

Bir postgresql / postgis çözümü olduğu için konu dışı olabilir:

Postgres / postgis'te geopanda'ya uyarlanabilecek / uygulanabilecek basit bir O (N ^ 2) sorgusudur.

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

ve 5 dikdörtgen tanımlar:

resim açıklamasını buraya girin

Tablonun kendisiyle kesişim isteği:

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; 

birbirleriyle kesişen alanları gösterir:

 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

Bu temeli kullanarak gruptan her kimlik nesnesi için sayıları clausel ile toplayabilirsiniz:

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;

Sonuç istenen paterni gösterir.

 id | count 
----+-------
  1 |     2
  2 |     3
  3 |     3
  4 |     2
  5 |     4
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.