Shapely बहुभुज के चौराहों में गिनती की सुविधा


13

मेरे पास एक जियोपैन्ड है GeoDataFrame जिसमें सैकड़ों सुडौल Polygonऔर MultiPolygonज्यामितीय हैं। बहुभुज कई स्थानों पर ओवरलैप करते हैं। मैं एक नई ज्यामिति बनाना चाहता हूं जिसमें उनमें से कितने ओवरलैप हैं, इसकी एक गिनती है। कुछ इस तरह:

गिनती के ओवरलैप्स

क्या किसी के पास इस बारे में कोई विचार है? मैं एक रास्ता भी नहीं देख सकता।

आखिरकार मैं विशेष रूप से बहुभुजों को वजन करने में सक्षम होना चाहूंगा, ताकि कुछ बहुभुज अपने आप में 2 के लायक हो सकें। shapelyZ क्षेत्र के साथ ऐसा करना अच्छा हो सकता है।

एक तरफ: मैं विशेष रूप से इन पुस्तकालयों में से किसी से बंधा नहीं हूं, यह सिर्फ वहीं है जहां मैंने समाप्त किया है। इन जियोमेट्री में निर्देशांक वास्तव में पिक्सेल निर्देशांक हैं - मैं किसी अन्य छवि पर ओवरले के लिए एक रेखापुंज बनाने की दिशा में ठोकर खा रहा हूं। मैं अपने पदचिह्न को यथासंभव छोटा रखना पसंद करूंगा, क्योंकि मैं इस सामान को क्लाउड सर्वर आदि में तैनात करने में सक्षम होना चाहता हूं, जहां मैं यादृच्छिक सामान स्थापित करने में सक्षम नहीं हो सकता।


इस उदाहरण का प्रयास करें । आप प्रत्येक 1-से -1 चौराहे के लिए बहुभुज को विभाजित कर सकते हैं और प्रत्येक उदाहरण की गणना कर सकते हैं, गिनती संख्या और फिर विशेषता तालिका के साथ आबाद करने के लिए अजगर में एक सूची बनाएं।
blu_sr

जबकि इसमें कोई कोड शामिल नहीं है, लेकिन SO पर यह उत्तर यह जांचने के लिए एक एल्गोरिदम का वर्णन करता है कि क्या एक बहुभुज पूरी तरह से दूसरे के भीतर है। मुझे लगता है कि यदि आपने लाइन-सेगमेंट के बीच कम से कम एक लाइन-चौराहे की जांच की, तो यह बहुभुज को ओवरलैप करने का संकेत देगा।
स्टेवज

ऐसा लगता है कि जियोफोन फंक्शन जियोसरीज.इंटरसेक्ट्स है ; मुझे आश्चर्य है कि अगर यह बहुभुज पर काम करता है।
स्टेवज

क्या आपके पास उन्हें चीरने की क्षमता है? यदि आप उन सभी को बहुभुज में रखने के लिए रिस्टार्ट करते हैं, तो आप उन्हें एक साथ जोड़ने के लिए सुन्न का उपयोग कर सकते हैं और परिणाम में प्रत्येक संख्या इंगित करेगी कि उस पिक्सेल पर कितने बहुभुज ओवरलैप हैं।
user1269942

जवाबों:


2

विषय बंद हो सकता है क्योंकि यह एक पोस्टग्रैक्स्ल / पोस्टगिस समाधान है:

पोस्टग्रेज / पोस्टगिस में यह एक साधारण 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

इस आधार का उपयोग करके आप समूह के माध्यम से समूह के माध्यम से प्रत्येक आईडी ऑब्जेक्ट के लिए संख्याओं को एकत्र कर सकते हैं :

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.