Tính hướng của mỗi bên của đa giác bằng ArcPy?


9

Tôi muốn kiểm tra hướng của mỗi dòng trong một đa giác để tôi có thể tính toán mức tiếp xúc mặt trời của chúng. Mỗi đa giác đại diện cho một tòa nhà, và có chiều cao liên quan. Hiện tại, tôi chỉ muốn xem xét định hướng, và sau đó sẽ xem xét các vấn đề về bóng.

Một cách tiếp cận tôi nghĩ là chia đa giác thành các dòng và tính toán hướng của mỗi dòng, nhưng khó khăn là sau đó tôi phải xác định mặt ngoài của dòng đó. Mặc dù hầu hết các đa giác đều là các hình bốn cạnh đơn giản với các đường thẳng, nhưng có một số nhỏ không phải là trường hợp này (một vấn đề mà tôi chỉ muốn xem xét, nhưng chưa phải giải quyết).

Tôi quen thuộc với python và dự định thực hiện tất cả điều này từ một kịch bản.


1
Làm các câu trả lời cho câu hỏi này giúp: gis.stackexchange.com/questions/1886/iêu
Sean

@Sean - cảm ơn, vâng, điều đó giúp ích nói chung. Tôi không quen thuộc với các lệnh ArcGIS cụ thể có thể được sử dụng để làm điều này. Ngoài ra, vấn đề về mặt bên trong / bên ngoài của đường thẳng trong đa giác vẫn còn.
djq

Khi bạn nói 'định hướng', bạn chưa định nghĩa nó đủ tốt cho tôi --- chẳng hạn định hướng của một hình lục giác hoàn hảo là gì?
Dan S.

@Dan S. Tôi vừa chỉnh sửa câu trả lời của mình để bao gồm định hướng của từng dòng trong đa giác.
djq

xin lỗi người trả lời - tôi đã không quản lý để giao tiền thưởng đúng cách ngày hôm qua.
djq

Câu trả lời:


6

Nếu bạn chỉ muốn định hướng đa số, hãy xem câu trả lời của @Mapperz ở trên.

Mặt khác, như bạn nói, bạn có thể chia đa giác thành các dòng bằng công cụ Polygon To Line . Điều này thêm trường FID bên trái và bên phải, trong đó trường là -1 nếu không có đa giác bên ngoài - điều này có thể gây ra một chút lẩm bẩm về việc nếu các tòa nhà của bạn liền kề hoặc chồng chéo.

Từ đó, bạn có thể phân chia các dòng của mình ở mọi đỉnh (có thể sử dụng Chia thành các dòng COGO ), sau đó tính toán các góc trên mỗi dòng (có khả năng bằng cách cập nhật các thuộc tính COGO ).

Giả sử bạn đã tính toán trường góc của mình từ phía Bắc, khía cạnh sẽ chính xác trong đó góc bên trái là -1 và để có được khía cạnh khi bên phải làID chỉ cần thêm 180 °. Sau đó, dựa trên FID ban đầu, bạn có thể tổng hợp, có được khía cạnh đa số dựa trên độ dài, v.v.

Công cụ đa giác để có thể có kịch bản, (theo như tôi biết) các công cụ COGO thì không, vì vậy bạn sẽ phải tự mình nghĩ ra một cái gì đó.

Hi vọng điêu nay co ich!


2
Trình cắm không biết xấu hổ và nhận xét: Đầu tiên, nếu bạn không có giấy phép Thông tin, code.google.com/p/boundary-generator thực hiện ít nhiều giống như công cụ Đa giác thành Đường. Thứ hai - điều này cung cấp cho bạn nhiều thông tin hơn là chỉ nhìn vào một số định hướng chung của đa giác tổng thể ... ví dụ: bạn có thể sử dụng bảng kết quả để thực hiện các phép tính phơi nắng chính xác hơn, có tính đến từng khía cạnh của từng bức tường .
Dan S.


5

Tìm định hướng

Trong một tập lệnh, đa giác sẽ có sẵn dưới dạng một tập hợp các vòng - một vòng ngoài và không hoặc nhiều vòng trong - với mỗi vòng được biểu thị bằng một vectơ theo thứ tự tuần hoàn (v [0], v 1 , ... , v [m-1], v [m] = v [0]). Mỗi vectơ cho tọa độ của một đỉnh (không có hai đỉnh liên tiếp trùng nhau). Từ đó, điều này rất đơn giản, như những người khác đã chỉ ra, để có được các vectơ bình thường (nghĩa là các vectơ vuông góc với các hướng cạnh):

n [i] = t (v [i + 1] - v [i]).

Thao tác "t" xoay một vectơ 90 độ ngược chiều kim đồng hồ :

t ((x, y)) = (y, -x).

Chỉ các hướng của các vectơ bình thường này mới quan trọng, vì vậy hãy bán lại chúng để có độ dài đơn vị: một vectơ (x, y) tương ứng với (x / s, y / s) trong đó s = Sqrt (x ^ 2 + y ^ 2) (mà là chiều dài của cạnh tương ứng của nó). Từ bây giờ, hãy giả sử điều này đã được thực hiện. Viết các thành phần của các vectơ đơn vị kết quả là

n [i] = (u [i], v [i]), i = 0, 1, ..., m-1.

Phân biệt đối xử từ bên trong

Như bạn nhận xét, điều này để lại một sự mơ hồ định hướng: chúng ta nên sử dụng n [i] hay -n [i]? Cái nào chỉ ra ngoài? Câu hỏi này tương đương với việc tìm mức độ của bản đồ Gauss . Để tính toán nó, bạn cần tính tổng các góc mà các hướng thông thường thay đổi khi bạn diễu hành quanh một chiếc nhẫn. Vì các vectơ bình thường có độ dài đơn vị, cosin của góc giữa hai cạnh liên tiếp là

Cos (q_i) = n [i]. n [i + 1] = u [i] * u [i + 1] + v [i] * v [i + 1], i = 0, 1, ..., m-1.

(Xác định n [m] = n [0].)

Sin của góc giữa hai cạnh liên tiếp là

Tội lỗi (q_i) = n [i]. t (n [i + 1]) = u [i] * v [i + 1] - v [i] * u [i + 1].

(Lưu ý rằng các tính toán này chỉ yêu cầu tổng, chênh lệch và sản phẩm cho đến nay.) Áp dụng hàm tiếp tuyến nghịch đảo chính (ATan2) cho bất kỳ cặp (cosine, sin) nào cho góc q_i trong khoảng -180 đến 180 độ. Tổng các góc này cho i = 0, 1, ..., n-1 tạo ra (lỗi tới điểm nổi) tổng độ cong của vòng, phải là bội số của 360 độ; đối với một vòng không tự giao nhau, nó sẽ là +360 hoặc -360. Trong trường hợp đầu tiên độ là 1 và trong trường hợp thứ hai độ là -1. Tất cả các quy tắc đều hướng ra bên ngoài khi độ của vòng ngoài là +1 và độ của các vòng trong là -1. Định hướng lại chúng theo vòng, khi cần thiết, theo quy tắc này. Đó là, nếu mức độ của bất kỳ chiếc nhẫn nào trái ngược với mức độ cần thiết, hãy phủ nhận tất cả các quy tắc cho chiếc nhẫn đó. Bây giờ bạn có thể tiến hành tính toán phơi nắng của bạn.


Cảm ơn bạn đã trả lời rất toàn diện. Khi bạn nói, 'Trong một tập lệnh, đa giác sẽ có sẵn dưới dạng một tập hợp các vòng', đa giác có sẵn như thế nào? Mặc dù quen thuộc với một số kịch bản python nhưng tôi không biết làm thế nào để diễn giải đa giác theo cách này. Tôi đang đọc qua điều này một cách chậm rãi và cố gắng hiểu nó, nhưng tôi gặp khó khăn khi dịch một số lời giải thích thành mã giả mà tôi có thể viết.
djq

Một vài lưu ý về câu trả lời này: Các API GIS điển hình sẽ luôn hiển thị bên ngoài đa giác theo thứ tự ngược chiều kim đồng hồ, IIRC, có nghĩa là bạn không phải thực hiện việc phân biệt đối xử bên ngoài từ bên trong - chỉ cần sử dụng xoay theo chiều kim đồng hồ ở các vòng ngoài và ngược chiều kim đồng hồ trên các lỗ. Một điều rõ ràng cho celenius: bit 'tập hợp các vòng' là cách mà hầu hết các API, bao gồm cả python của ArcGIS, cho phép bạn phân tách một đa giác thành các đoạn đường cấu thành của nó - một vòng là một đường cong khép kín của chúng. Vì đa giác có thể hỗ trợ các đảo và lỗ hổng, bạn có thể có nhiều vòng ...
Dan S.

@Dan Tôi ước rằng đó là trường hợp mà các GIS duy trì các đại diện nhất quán như vậy. Trong những năm qua, phần mềm ESRI đã dao động qua lại giữa các đa giác có định hướng tiêu cực và tích cực và chỉ khiến chúng mất phương hướng. Tại thời điểm này tôi không chắc chắn tôi sẽ dựa vào các tuyên bố được ghi chép về cách tiếp cận hiện tại của họ: Tôi sẽ thận trọng. Chi phí ít để kiểm tra hướng sau khi bạn đã xử lý tất cả các cạnh trong một vòng.
whuber

.. tốt, tôi đã đưa vào từ chối trách nhiệm IIRC nhỏ đó, rất may. ;) Đó không phải là tất cả những gì tôi thường làm công cụ cấp hình học trên ngăn xếp ESRI nữa.
Dan S.

@Dan S. - Tôi vẫn chưa rõ về cách thức này có thể được lập trình trong python. Có hướng dẫn nào cho việc này không?
djq

1

Điều này có thể giúp đỡ?


Đó là một bài báo thú vị mà bạn đã đào lên. Tuy nhiên, không có phương pháp nào được mô tả có liên quan đến tính toán phơi nhiễm mặt trời (trừ khi tính toán được dự định là xấp xỉ thô, dường như không phải là trường hợp ở đây).
whuber

1

/ * Có lẽ điều này giúp:

Azimuth - pi / 2 là hướng ra ngoài của các cạnh của đa giác RHR:

Dưới đây là một ví dụ PostGIS, bạn có thể tạo bảng bldg117862 bằng cách sử dụng câu lệnh ở cuối. SRID là EPSG 2271 (PA StatePlane North feet) và hình học là Đa giác. Để trực quan hóa trong ArcGIS 10, hãy dán truy vấn / truy vấn con vào kết nối Lớp truy vấn vào postgis sau khi tạo bảng bldg117862. * /

- === BẮT ĐẦU SỐ LƯỢNG ===

/ * Truy vấn bên ngoài cung cấp hướng của các trực giao bên ngoài và tạo các đường trực giao bên ngoài có độ dài bằng nhau như các cạnh của các cạnh từ trung điểm của các cạnh.

Hướng đối diện chiếm ưu thế sẽ là tổng chiều dài, được nhóm theo hướng, theo thứ tự giảm dần * /

CHỌN line_id là side_id, length, độ (orthoaz) làm định hướng, st_makeline (st_setsrid (st_line_interpolate_point (geom, .5), 2271), st_setsrid (st_makepoint (st_x (st_line_inter) orthoaz))), st_y (st_line_interpolate_point (geom, .5)) + (length * (cos (orthoaz)))), 2271)) là geom từ

- truy vấn phụ bên ngoài tạo các đường từ các cặp điểm của các cạnh, tính góc phương vị (orthoaz) của trực giao cho mỗi phân đoạn

(CHỌN bldg2009gid, line_id, st_length (st_makeline (điểm bắt đầu, điểm cuối)) :: số (10,2) dưới dạng độ dài, góc phương vị (điểm bắt đầu, điểm cuối), góc phương vị (điểm bắt đầu, điểm cuối) - pi () / 2 là orthoaz, stim điểm bắt đầu, điểm cuối) là geom từ

/ * truy vấn con trong cùng - sử dụng Gener_series () để phân tách đa giác xây dựng thành các cặp điểm bắt đầu / điểm cuối của hai bên - note1 - buộc quy tắc bàn tay phải để đảm bảo định hướng chung cho tất cả các cạnh đa giác note2 - ví dụ sử dụng đa giác, cho đa giác hình học () có thể gỡ bỏ */

(CHỌN tạo_series (1, npoint (exteriorring (hình học (st_forceRHR (geom), 1))) - 1) dưới dạng line_id, gid như bldg2009gid, pointn (exteriorring (hình học (st_forceRHR (ge), 1) npoint (exteriorring (hình học (st_forceRHR (geom), 1))) - 1)) là điểm bắt đầu, pointn (exteriorring (hình học (st_forceRHR (geom), 1)), created_series (2, npoint (exteriorr ), 1))))) làm điểm cuối từ bldg117862) là t1) là t2

- === KẾT THÚC ===

- các câu lệnh tạo / chèn bảng bldg117862

THIẾT LẬP STANDARD_CONFORMING_STRING TO ON; CHỌN DropGeometryColumn ('', 'bldg117862', 'geom'); BẢNG DROP "bldg117862"; BẮT ĐẦU; TẠO BẢNG "bldg117862" (gid serial PRIMARY KEY, "Motherpin" varchar (14), "taxpin" varchar (14), "status" varchar (15), "area" dạng số, "trước_area" số, "pct_change" số, "hình ảnh" varchar (133), "mappage" varchar (6), "sref_gid" int4, "e_address" varchar (19), "a_address" varchar (19), "perim" số, "card" int4, "a_addnum" int4, "e_street" varchar (50), "a_street" varchar (50), "e_hsnum" varchar (10)); CHỌN AddGeometryColumn ('', 'bldg117862', 'geom', '2271', 'MULTIPOLYGON', 2); 0106000020DF080000010000000103000020DF080000010000000B0000008C721D6C98AC34415E2C5BB9D3E32541AE56DE17BEAC34410613E5A0A0E325411AB6C794AEAC3441BA392FE372E32541C89C38429DAC3441643857628AE325418C299A9095AC3441F66C29B573E32541983F02087EAC34413080AA9F93E325419BAC3C0A86AC3441AC1F3B3DABE32541803A40B974AC3441E8CF3DB9C2E325413E3758C186AC3441D0AAB0E7F7E325410AAAA5429BAC3441BA971217DCE325418C721D6C98AC34415E2C5BB9D3E32541' ); TẠO INDEX "bldg117862_geom_gist" ON "bldg117862" bằng cách sử dụng ý chính ("geom" gist_geometry_ops); KẾT THÚC;


0

Giả sử rằng hướng của các đoạn đường là không đổi trong một đa giác, bạn có thể tính toán ổ đỡ (tiêu đề) của một vectơ vuông góc với mỗi đoạn đường. Tôi không có thời gian ngay bây giờ để viết mã nhưng nếu bạn cần toán, nó có thể dễ dàng được cung cấp :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.