การนับคุณสมบัติเป็นจุดตัดของ Shapely Polygons


13

ฉันมีgeopandas GeoDataFrameที่ประกอบด้วยหุ่นเชิดPolygonและMultiPolygonรูปปั้นนับร้อย รูปหลายเหลี่ยมซ้อนกันในหลายสถานที่ ฉันต้องการสร้างรูปทรงเรขาคณิตใหม่ที่มีการนับจำนวนของพวกเขาทับซ้อนกัน บางสิ่งเช่นนี้

การนับการทับซ้อน

ใครบ้างมีความคิดสำหรับวิธีการวิธีการนี้ ฉันไม่สามารถเห็นทางเข้า

ในที่สุดฉันต้องการน้ำหนักรูปหลายเหลี่ยมโดยเฉพาะอย่างยิ่งเพื่อให้รูปหลายเหลี่ยมบางส่วนอาจมีค่าเป็น 2 ด้วยตัวเอง การทำเช่นนี้กับshapelyเขตข้อมูล Z อาจจะดี

นอกเหนือ: ฉันไม่ได้ผูกติดอยู่กับห้องสมุดใด ๆ เป็นพิเศษมันเป็นที่ที่ฉันไปจบแล้ว พิกัดในรูปทรงเรขาคณิตเหล่านี้คือพิกัดพิกเซลจริง ๆ แล้วฉันกำลังสะดุดเพื่อทำให้แรสเตอร์ซ้อนทับในรูปภาพอื่น ฉันต้องการทำให้รอยเท้าของฉันเล็กที่สุดเท่าที่จะเป็นไปได้เนื่องจากฉันต้องการที่จะสามารถปรับใช้สิ่งนี้กับเซิร์ฟเวอร์คลาวด์ ฯลฯ ซึ่งฉันอาจไม่สามารถติดตั้งสิ่งของแบบสุ่มได้


ลองตัวอย่างนี้ คุณสามารถแบ่งรูปหลายเหลี่ยมสำหรับแต่ละ 1 ถึง 1 แยกและนับแต่ละอินสแตนซ์ทำรายการในหลามเพื่อเติมด้วยจำนวนการนับแล้วตารางแอตทริบิวต์
blu_sr

ในขณะที่มีเป็นรหัสไม่รวม แต่นี้คำตอบในดังนั้นอธิบายขั้นตอนวิธีการตรวจสอบว่าเป็นหนึ่งในรูปหลายเหลี่ยมทั้งหมดภายในอีก ฉันคิดว่าถ้าคุณตรวจสอบอย่างน้อยหนึ่งจุดตัดระหว่างเส้นส่วนนั้นก็จะบ่งบอกถึงรูปหลายเหลี่ยมที่ทับซ้อนกัน
stevej

ดูเหมือนว่าจะมีฟังก์ชั่นgeopandas GeoSeries.intersects ; ฉันสงสัยว่ามันใช้งานได้กับรูปหลายเหลี่ยม
stevej

คุณมีความสามารถในการแรสเตอร์เหล่านั้นหรือไม่ หากคุณ rasterize พวกเขาทั้งหมดเพื่อให้มีคนในรูปหลายเหลี่ยมคุณสามารถใช้ numpy เพื่อเพิ่มเข้าด้วยกันและแต่ละหมายเลขในผลลัพธ์จะระบุจำนวนรูปหลายเหลี่ยมที่ทับซ้อนกันที่พิกเซลนั้น
user1269942

คำตอบ:


2

อาจปิดหัวข้อเนื่องจากเป็นโซลูชัน postgresql / postgis:

ใน postgres / postgis มันเป็นแบบสอบถาม O (N ^ 2) แบบง่าย ๆ ที่อาจ / อาจนำมาใช้กับ geopanda

$ 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 ผ่านกลุ่มโดย 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;

ผลลัพธ์แสดงรูปแบบที่ต้องการ

 id | count 
----+-------
  1 |     2
  2 |     3
  3 |     3
  4 |     2
  5 |     4
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.