2013-01-21 40 views
6

Tôi đã cố gắng sử dụng shapely để tìm giao điểm của một đường thẳng và một đa giác, nhưng tôi đang gặp vấn đề với một số số dấu phẩy động.Giao diện đa giác với đường thẳng | Python Shapely

Ví dụ mã:

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 

Những gì tôi mong chờ là danh sách của hai đỉnh.

Điểm 1: điểm sẽ nằm trong đa giác hoặc (4.0, -2.0000000000000004) trong trường hợp này.

Điểm 2: điểm đó là giao điểm của [(4.0, -2.0000000000000004), (2,0, -1.1102230246251565e-15)] và [(3,0, -3.0), (4,0, -2,0)].

Tuy nhiên, kết quả tôi nhận được là:

[(4.0, -2.0000000000000004)] 

Tôi cũng đã kiểm tra xem liệu có một ngã tư ở tất cả với cạnh mà tôi đang tìm tại địa chỉ:

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

Nếu tôi thay thế (4.0, -2.0000000000000004) với (4.0, -2.000000000000000) thì giao điểm cạnh sẽ đánh giá là True.

Có ai có bất kỳ ý tưởng nào về những gì đang diễn ra hoặc những gì tôi đang bỏ lỡ không? Cảm ơn!

enter image description here

Edit:

Tôi đã thử nghiệm sử dụng phiên bản quyến rũ 1.12 và GEOS của 3.3.1, 3.3.5, 3.3.6, 3.3.7.

Trong trường hợp bất cứ ai là tò mò như thế nào tôi cập nhật phiên bản GEOS trên Windows:

Downloaded các geos- [version] .tar.bz2 từ trang web của GEOS. Giải nén các tập tin và chạy CMake trên nó, bằng cách sử dụng Visual Studio 10 Win64 máy phát điện. Đã mở tệp .sln và xây dựng nó rồi di chuyển geos_c.dll đã tạo ra và dán nó lên nơi geos_c.dll đã được cài đặt bằng shapely trong thư mục Python.

+0

một hình ảnh sẽ làm câu hỏi này một thế giới tốt – flup

+1

Cảm ơn unutbu cho hình ảnh, có vẻ tốt hơn so với cái tôi sắp vẽ! – Lisa

+0

khi tôi làm 'ngã = shapely_poly.intersection (shapely_line)' và sau đó 'in intersection' tôi nhận được' chuỗi đường (4,0000000000000000 -2,0000000000000004, 4,0000000000000000 -2,0000000000000000) ' – flup

Trả lời

3

Shapely được xây dựng trên đầu trang của một trình bao bọc C xung quanh thư viện C++ GEOS. Một nơi nào đó deep inside this C++ library ngồi các lớp Precision xử lý các lỗi roundoff. Tôi nghĩ rằng chúng tôi có thể kết luận rằng phiên bản của bạn của Shapely, và các thư viện địa lý, xử lý trường hợp này một cách khác nhau. Thật không may, mã truy cập vào mô hình chính xác không có sẵn trong C api, và do đó không có trong Shapely. Xem http://lists.gispython.org/pipermail/community/2011-February/002898.html

Thay đổi thành phiên bản địa lý cao hơn có thể giải quyết được vấn đề của bạn. Nó hoạt động tốt trên máy tính của tôi với 1.2.16 shapely và libgeos 3.3.5-CAPI-1.7.5.

+0

Được rồi, xin lỗi vì sự chậm trễ. Nó được đóng gói với 3.3.1 và tôi đã thử sử dụng 3.3.5-CAPI-1.7.5, 3.3.6-CAPI-1.7.6, 3.3.7-CAPI-1.7.7 mà không có may mắn và chạy 1.12 Shapely . Tôi nghĩ nó giống như phản ứng của Mike với sự khác biệt duy nhất mà tôi có thể nghĩ là khác biệt là nền tảng. – Lisa

+0

Sẽ đánh dấu điều này là chính xác vì cuối cùng nó có vẻ là một cái gì đó liên quan đến sự khác biệt trong nền tảng anyways. – Lisa

+0

Một sau cùng, bạn có 32 bit hoặc 64 bit máy/dll không? – flup

Các vấn đề liên quan