2013-01-21 13 views
6

मैं एक लाइन और बहुभुज के चौराहे को खोजने के लिए आकार का उपयोग करने की कोशिश कर रहा हूं, लेकिन मुझे कुछ फ़्लोटिंग पॉइंट नंबरों के साथ समस्याएं आ रही हैं।लाइन के साथ बहुभुज छेड़छाड़ | पायथन Shapely

उदाहरण कोड:

polygon = [(4.0, -2.0), (5.0, -2.0), (4.0, -3.0), (3.0, -3.0), (4.0, -2.0)] 
shapely_poly = shapely.geometry.Polygon(polygon) 

line = [(4.0, -2.0000000000000004), (2.0, -1.1102230246251565e-15)] 
shapely_line = shapely.geometry.LineString(line) 

intersection_line = list(shapely_poly.intersection(shapely_line).coords) 
print intersection_line 

क्या मैं उम्मीद करेंगे दो कोने की एक सूची है।

प्वाइंट 1: पॉइंट जो पॉलीगॉन के अंदर होगा, या (4.0, -2.0000000000000004) इस मामले में होगा।

प्वाइंट 2: बिंदु [[4.0, -2.0000000000000004), (2.0, -1.1102230246251565e-15)] और [(3.0, -3.0), (4.0, -2.0)] का अंतर है।

हालांकि, परिणाम मैं प्राप्त है:

[(4.0, -2.0000000000000004)] 

मैं भी जांच लिया है कि मैं कम से देख रहा हूँ बढ़त के साथ एक चौराहे पर सब है या नहीं:

>>> edge = shapely.geometry.LineString([(3.0, -3.0), (4.0, -2.0)]) 
>>> edge.intersects(shapely_line) 
False 

अगर मैं की जगह (4.0, -2.0000000000000004) के साथ (4.0, -2.000000000000000) तो किनारे का चौराहे सही पर मूल्यांकन करेगा।

क्या किसी के पास क्या चल रहा है या मैं क्या खो रहा हूं इसके बारे में कोई विचार है? धन्यवाद!

enter image description here

संपादित करें:

मैं सुडौल संस्करण 1.12 और 3.3.1, 3.3.5, 3.3.6, 3.3.7 के GEOS का उपयोग कर परीक्षण किया है।

GEOS वेबसाइट से डाउनलोड किया geos- [संस्करण] .tar.bz2:

मामले में किसी को भी कैसे मैं विंडोज पर GEOS संस्करण अद्यतन जानने के लिए उत्सुक है। विजुअल स्टूडियो 10 विन 64 जनरेटर का उपयोग करके फ़ाइलों को निकाला और उस पर सीएमके चलाया। .sln फ़ाइल को खोल दिया और इसे बनाया तो जेनरेट geos_c.dll को स्थानांतरित कर दिया और इसे चिपकाया जहां geos_c.dll को Python निर्देशिका में आकार में स्थापित किया गया था।

+0

एक तस्वीर इस प्रश्न को अच्छी तरह से – flup

+1

की एक तस्वीर करेगी, तस्वीर के लिए धन्यवाद unutbu, यह एक ड्रॉ करने के बारे में बेहतर दिखता है! – Lisa

+0

जब मैं 'चौराहे = shapely_poly.intersection (shapely_line)' और उसके बाद 'प्रिंट intersection' मैं' LINESTRING (4.0000000000000000 -2.0000000000000004, 4.0000000000000000 -2.0000000000000000) ' – flup

उत्तर

3

Shapely C++ GEOS लाइब्रेरी के चारों ओर एक सी रैपर के शीर्ष पर बनाया गया है। कहीं deep inside this C++ library परिशुद्धता कक्षाएं बैठें जो राउंडऑफ त्रुटियों को संभालती हैं। मुझे लगता है कि हम निष्कर्ष निकाल सकते हैं कि आकार के आपके संस्करण, और भौगोलिक पुस्तकालय, इस मामले को अलग-अलग संभालते हैं। दुर्भाग्य से कोड जो परिशुद्धता मॉडल तक पहुंचता है वह सी एपीआई में उपलब्ध नहीं है, और इसलिए न तो आकार में। http://lists.gispython.org/pipermail/community/2011-February/002898.html

भौगोलिक के उच्च संस्करण में बदलने से आपकी समस्या हल हो सकती है, हालांकि। यह मेरी मशीन पर आकार 1.2.16 और libgeos 3.3.5-CAPI-1.7.5 के साथ ठीक काम करता है।

+0

ठीक है, देरी के लिए खेद है। जिसकी पैकेजिंग हुई वह 3.3.1 थी और मैंने 3.3.5-सीएपीआई-1.7.5, 3.3.6-सीएपीआई-1.7.6, 3.3.7-सीएपीआई-1.7.7 का उपयोग करने की कोशिश की और भाग्य के साथ 1.12 आकार का उपयोग किया । मुझे लगता है कि यह एकमात्र अन्य अंतर के साथ माइक की प्रतिक्रिया की तरह है, मैं अलग-अलग होने का विचार कर सकता हूं। – Lisa

+0

अंत में इसे सही के रूप में चिह्नित करने के लिए जा रहा है, ऐसा लगता है कि प्लेटफार्मों में किसी भी तरह से अंतर से संबंधित कुछ ऐसा लगता है। – Lisa

+0

एक आखिरी बाद विचार, क्या आपके पास 32 बिट्स या 64 बिट्स मशीन/डीएलएस हैं? – flup

संबंधित मुद्दे