การคำนวณการวางแนวของรูปหลายเหลี่ยมแต่ละด้านโดยใช้ ArcPy?


9

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

วิธีการหนึ่งที่ฉันคิดคือการแบ่งรูปหลายเหลี่ยมออกเป็นเส้นตรงและเพื่อคำนวณการวางแนวของแต่ละบรรทัด แต่ปัญหาก็คือฉันต้องระบุใบหน้าด้านนอกของเส้นนั้น แม้ว่ารูปหลายเหลี่ยมส่วนใหญ่จะเป็นตัวเลขสี่ด้านที่มีเส้นตรงเรียบง่าย แต่ก็มีจำนวนน้อยที่ไม่ใช่กรณีนี้ (เป็นปัญหาที่ฉันต้องการพิจารณา แต่ยังไม่ต้องแก้ปัญหา)

ฉันคุ้นเคยกับงูหลามและวางแผนที่จะทำสิ่งนี้ทั้งหมดจากสคริปต์


1
ทำคำตอบสำหรับคำถามนี้ช่วย: gis.stackexchange.com/questions/1886/…
Sean

@Sean - ขอบคุณใช่ว่าจะช่วยโดยทั่วไป ฉันไม่คุ้นเคยกับคำสั่ง ArcGIS เฉพาะที่สามารถใช้ทำสิ่งนี้ได้ นอกจากนี้ปัญหาของการทราบว่าใบหน้าด้านใน / ด้านนอกของเส้นในรูปหลายเหลี่ยมยังคงอยู่
djq

เมื่อคุณพูดว่า 'การวางแนว' คุณยังไม่ได้กำหนดอย่างชัดเจนเพียงพอสำหรับฉัน --- การวางแนวของรูปหกเหลี่ยมที่สมบูรณ์แบบคืออะไร?
Dan S.

@Dan S. ฉันเพิ่งแก้ไขคำตอบเพื่อรวมการวางแนวของแต่ละบรรทัดในรูปหลายเหลี่ยม
djq

ผู้ตอบขอโทษ - ฉันไม่ได้จัดการมอบหมายเงินรางวัลเมื่อวานนี้
djq

คำตอบ:


6

หากคุณต้องการการปฐมนิเทศเป็นส่วนใหญ่ลองอ่านคำตอบของ @Mapperz ด้านบน

มิฉะนั้นอย่างที่คุณบอกว่าคุณสามารถแบ่งรูปหลายเหลี่ยมเป็นเส้นโดยใช้เครื่องมือรูปหลายเหลี่ยมถึงเส้น สิ่งนี้จะเพิ่มเขตข้อมูล FID ซ้ายและขวาโดยที่เขตข้อมูลนั้นคือ -1 หากไม่มีรูปหลายเหลี่ยมด้านนอก - ซึ่งอาจทำให้เกิดการก่อกวนเล็กน้อยแม้ว่าอาคารของคุณจะอยู่ติดกันหรือทับซ้อนกัน

จากตรงนั้นคุณสามารถแบ่งบรรทัดของคุณในทุก ๆ จุดสุดยอด (อาจใช้แยกเป็นเส้น COGO ) จากนั้นคำนวณมุมของแต่ละบรรทัด (อาจเกิดจากการอัปเดตแอตทริบิวต์ COGO )

สมมติว่าคุณมีเขตข้อมูลมุมของคุณคำนวณจากทางทิศเหนือด้านจะถูกต้องโดยที่ left_FID เป็น -1 และเพื่อให้ได้มุมมองเมื่อ right_FID เป็น -1 เพียงเพิ่ม 180 ° จากนั้นอิงตาม FID ดั้งเดิมที่คุณสามารถรวมรับส่วนใหญ่ตามความยาวเป็นต้น

เครื่องมือรูปหลายเหลี่ยมถึงบรรทัดสามารถใช้สคริปต์ได้ (เท่าที่ฉันรู้) เครื่องมือ COGO ไม่ได้ดังนั้นคุณจะต้องมีบางสิ่งที่นั่นด้วยตัวคุณเอง

หวังว่านี่จะช่วยได้!


2
ปลั๊กที่ไร้ยางอายและความคิดเห็น: อันดับแรกหากคุณไม่มีใบอนุญาตข้อมูล, code.google.com/p/boundary-generatorทำสิ่งเดียวกันกับเครื่องมือรูปหลายเหลี่ยมถึงเส้นมากขึ้นหรือน้อยลง ข้อที่สอง - สิ่งนี้จะให้ข้อมูลมากกว่าการมองแนวทั่วไปของรูปหลายเหลี่ยมโดยรวม ... ตัวอย่างเช่นคุณสามารถใช้ตารางผลลัพธ์เพื่อทำการคำนวณแสงแดดที่แม่นยำยิ่งขึ้นโดยคำนึงถึงผนังแต่ละด้าน .
Dan S.

5

คำนวณมุมหลักรูปหลายเหลี่ยม (การทำแผนที่)

คำนวณมุมที่โดดเด่นของคุณลักษณะรูปหลายเหลี่ยมอินพุตและกำหนดค่าให้กับฟิลด์ที่ระบุในคลาสคุณลักษณะ

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//007000000028000000.htm


5

หาทิศทาง

ภายในสคริปต์รูปหลายเหลี่ยมจะมีให้เป็นชุดของวงแหวน - วงแหวนรอบนอกหนึ่งวงและศูนย์หรือมากกว่านั้น - ด้วยวงแหวนแต่ละวงที่แสดงโดย tuple ของเวกเตอร์ที่มีคำสั่งเป็นวงรอบ (v [0], v 1 , ... , v [m-1], v [m] = v [0]) แต่ละเวกเตอร์ให้พิกัดของจุดยอด (โดยไม่มีจุดยอดสองจุดต่อเนื่องกัน) จากสิ่งนี้มันตรงไปตรงมาตามที่คนอื่น ๆ ชี้ให้เห็นเพื่อให้ได้เวกเตอร์ปกติ (เช่นเวกเตอร์ตั้งฉากกับทิศทางของขอบ):

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

การดำเนินการ "t" หมุนเวกเตอร์ 90 องศาทวนเข็มนาฬิกา :

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

เฉพาะทิศทางของเวกเตอร์ปกติเหล่านี้เท่านั้นดังนั้นควรลดความยาวของหน่วย: เวกเตอร์ (x, y) rescales ไปที่ (x / s, y / s) โดยที่ s = Sqrt (x ^ 2 + y ^ 2) (ซึ่ง คือความยาวของขอบที่สอดคล้องกัน) จากนี้ไปสมมติว่าสิ่งนี้ได้ทำไปแล้ว เขียนส่วนประกอบของเวกเตอร์ปกติของผลลัพธ์ที่ได้เป็น

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

แยกแยะภายนอกจากภายใน

ดังที่คุณกล่าวมาสิ่งนี้ทำให้เกิดความกำกวมในทิศทาง: เราควรใช้ n [i] หรือ -n [i] หรือไม่ จุดไหนที่อยู่ด้านนอก คำถามนี้จะเทียบเท่ากับการหาระดับของแผนที่เกาส์ ในการคำนวณคุณต้องรวมมุมที่ทิศทางปกติเปลี่ยนไปเมื่อคุณเดินไปรอบ ๆ วงแหวน เนื่องจากเวกเตอร์ปกติมีความยาวหน่วย, โคไซน์ของมุมระหว่างสองขอบต่อเนื่องคือ

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

(กำหนด n [m] = n [0])

ไซน์ของมุมระหว่างขอบต่อเนื่องสองอันคือ

บาป (q_i) = n [i] t (n [i + 1]) = u [i] * v [i + 1] - v [i] * u [i + 1]

(โปรดทราบว่าการคำนวณเหล่านี้ต้องการผลรวมความแตกต่างและผลิตภัณฑ์เท่านั้น) การใช้ฟังก์ชันแทนเจนต์หลักผกผัน (ATan2) กับคู่ใด ๆ (โคไซน์ไซน์) ให้มุม q_i ระหว่าง -180 ถึง 180 องศา การรวมมุมเหล่านี้เข้าด้วยกันสำหรับ i = 0, 1, ... , n-1 ก่อให้เกิดความคลาดเคลื่อนทั้งหมดของวงแหวนซึ่งจะต้องมีหลายมุม 360 องศา; สำหรับวงแหวนที่ไม่ตัดกันแบบปิดนั้นจะเป็น +360 หรือ -360 ในกรณีแรกระดับคือ 1 และในกรณีที่สองระดับคือ -1 กฎเกณฑ์ทั้งหมดมุ่งเน้นภายนอกเมื่อระดับของวงแหวนรอบนอกเป็น +1 และองศาของวงแหวนภายในเป็น -1 จัดวางอีกครั้งตามลำดับตามความจำเป็นตามกฎนี้ นั่นคือถ้าระดับของวงแหวนใด ๆ อยู่ตรงข้ามกับที่ต้องการให้ลบล้างบรรทัดฐานทั้งหมดของวงแหวนนั้น ตอนนี้คุณสามารถดำเนินการคำนวณการ insolation ของคุณได้


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

หมายเหตุเล็กน้อยเกี่ยวกับคำตอบนี้: โดยทั่วไป GIS APIs มักจะนำเสนอด้านนอกของรูปหลายเหลี่ยมตามลำดับทวนเข็มนาฬิกา IIRC ซึ่งหมายความว่าคุณไม่จำเป็นต้องทำเช่นนั้นแยกแยะจากภายนอกภายใน - เพียงแค่ใช้การหมุนตามเข็มนาฬิกาบนวงแหวนรอบนอกและ ทวนเข็มนาฬิกาที่รู คำอธิบายสำหรับเซเลเนียส: บิต 'set of rings' เป็นวิธีที่ API ส่วนใหญ่รวมถึงไพ ธ อนของ ArcGIS ทำให้คุณสามารถแยกรูปหลายเหลี่ยมออกเป็นส่วนย่อยขององค์ประกอบ - วงแหวนเป็นเส้นโค้งที่ปิดของพวกเขา ตั้งแต่รูปหลายเหลี่ยมอาจสนับสนุนเกาะและหลุมคุณอาจมีแหวนหลายรายการ ...
แดนเอส

@Dan ฉันหวังว่ามันเป็นกรณีที่ GISes ยังคงเป็นตัวแทนที่สอดคล้องกันดังกล่าว ในช่วงหลายปีที่ผ่านมาซอฟต์แวร์ ESRI มีความผันผวนไปมาระหว่างรูปหลายเหลี่ยมเชิงบวกและเชิงลบและปล่อยให้มันไม่รู้สึกตัว ณ จุดนี้ฉันไม่แน่ใจว่าฉันจะไว้ใจแม้กระทั่งเอกสารที่เป็นเอกสารเกี่ยวกับวิธีการปัจจุบันของพวกเขา: ฉันจะต้องระมัดระวัง มีค่าใช้จ่ายเล็กน้อยในการตรวจสอบทิศทางหลังจากคุณประมวลผลขอบทั้งหมดในวงแหวนแล้ว
whuber

.. ดีฉันใส่ข้อจำกัดความรับผิดชอบ IIRC เล็กน้อยขอบคุณ ;) ไม่ใช่ทั้งหมดที่ฉันมักจะทำสิ่งที่ระดับเรขาคณิตในกอง ESRI อีกต่อไป
Dan S.

@Dan S. - ฉันยังไม่ชัดเจนเกี่ยวกับวิธีการเขียนโปรแกรมนี้ในหลาม มีแนวทางใดบ้างสำหรับเรื่องนี้?
djq

1

Can นี้ความช่วยเหลือ?


นั่นเป็นกระดาษที่น่าสนใจที่คุณขุดขึ้นมา อย่างไรก็ตามไม่มีวิธีการใดที่อธิบายว่ามีความเกี่ยวข้องกับการคำนวณการเปิดรับแสงอาทิตย์ (เว้นแต่ว่าการคำนวณนั้นมีวัตถุประสงค์เพื่อเป็นการประมาณคร่าวๆซึ่งไม่น่าจะเป็นกรณีที่นี่)
whuber

1

/ * อาจช่วยได้:

Azimuth - pi / 2 เป็นทิศทางออกไปทางด้านนอกของรูปหลายเหลี่ยม RHR:

นี่คือตัวอย่างของ PostGIS คุณสามารถสร้างตาราง bldg117862 โดยใช้คำสั่งที่ท้าย SRID คือ EPSG 2271 (PA StatePlane North Feet) และรูปทรงเรขาคณิตเป็น Multipolygon หากต้องการเห็นภาพใน ArcGIS 10 ให้วางคิวรี / แบบสอบถามย่อยลงในการเชื่อมต่อ Query Layer ไปยัง postgis หลังจากสร้างตาราง bldg117862 * /

- === เริ่มต้นของแบบสอบถาม ===

/ * ข้อความค้นหาด้านนอกให้การวางแนวของ orthogonals ภายนอกและสร้างเส้น orthogonal ภายนอกที่มีความยาวเท่ากันเท่ากับด้านข้างจากจุดกึ่งกลางของด้านข้าง

ทิศทางการหันหน้าที่โดดเด่นจะเป็นผลรวมของความยาวโดยจัดกลุ่มตามทิศทางตามลำดับจากมากไปน้อย * /

เลือก line_id เป็น side_id, ความยาว, องศา (orthoaz) เป็นการวางแนว, st_makeline (st_setsrid (st_line_interpolate_point (geom, .5), 2271), st_setsrid (st_makepoint (st_x (st_line_interpolate_point (geom, .5) orthoaz))), st_y (st_line_interpolate_point (geom, .5)) + (ยาว * (cos (orthoaz)))), 2271)) เป็น geom จาก

- ถัดไปแบบสอบถามย่อยด้านนอกทำให้เส้นจากคู่ชี้ด้านข้างคำนวณ azimuth (orthoaz) ของ orthogonal ภายนอกสำหรับแต่ละเซ็กเมนต์

(SELECT bldg2009gid, line_id, st_length (st_makeline (จุดเริ่มต้น, จุดสิ้นสุด)) :: ตัวเลข (10,2) เป็นความยาว, azimuth (จุดเริ่มต้น, จุดสิ้นสุด), azimuth (จุดเริ่มต้น, จุดสิ้นสุด) - pi () / 2 เป็น orthoaz, st_makeline จุดเริ่มต้นจุดสิ้นสุด) เป็น geom จาก

/ * แบบสอบถามย่อยด้านในสุด - ใช้ generate_series () เพื่อแยกรูปหลายเหลี่ยมของอาคารออกเป็นคู่ 'จุดเริ่มต้น / จุดสิ้นสุดของจุดด้านข้าง - note1 - บังคับกฎทางด้านขวามือเพื่อให้แน่ใจว่าทิศทางทั่วไปของรูปหลายเหลี่ยมด้าน note2 - ตัวอย่างใช้รูปหลายเหลี่ยม สามารถลบได้ * /

(SELECT generate_series (1, npoints (exteriorring (เรขาคณิต (st_forceRHR (geom), 1))) - 1) เป็น line_id, gid เป็น bldg2009gid, pointn (exteriorring (geometryn (st_forceRHR (geom), 1)) npoints (exteriorring (geometryn (st_forceRHR (geom), 1)) - 1)) เป็นจุดเริ่มต้น, pointn (exteriorring (geometryn (st_forceRHR (geom), 1)), generate_series (2, npoints (exteriorring (เรขาคณิต _ (st_forceRHR) ), 1))))) เป็นจุดสิ้นสุดจาก bldg117862) เป็น t1) เป็น t2

- === สิ้นสุดของแบบสอบถาม ===

- คำสั่งสร้าง / แทรกตาราง bldg117862

SET STANDARD_CONFORMING_STRINGS เป็น ON; เลือก DropGeometryColumn ('', 'bldg117862', 'geom'); DROP Table "bldg117862"; เริ่ม; สร้างตาราง "bldg117862" (คีย์หลักอนุกรม gid, "motherpin" varchar (14), "taxpin" varchar (14), "สถานะ" varchar (15), "พื้นที่" ตัวเลข, "prev_area" ตัวเลข, "pct_change" ตัวเลข "picture" varchar (133), "mappage" varchar (6), "sref_gid" int4, "e_address" varchar (19), "a_address" varchar (19), "perim" ตัวเลข, "card" int4, "a_addnum" int4, "e_street" varchar (50), "a_street" varchar (50), "e_hsnum" varchar (10)); เลือก AddGeometryColumn ('', 'bldg117862', 'geom', '2271', 'MULTIPOLYGON', 2); 0106000020DF080000010000000103000020DF080000010000000B0000008C721D6C98AC34415E2C5BB9D3E32541AE56DE17BEAC34410613E5A0A0E325411AB6C794AEAC3441BA392FE372E32541C89C38429DAC3441643857628AE325418C299A9095AC3441F66C29B573E32541983F02087EAC34413080AA9F93E325419BAC3C0A86AC3441AC1F3B3DABE32541803A40B974AC3441E8CF3DB9C2E325413E3758C186AC3441D0AAB0E7F7E325410AAAA5429BAC3441BA971217DCE325418C721D6C98AC34415E2C5BB9D3E32541' ); สร้างดัชนี "bldg117862_geom_gist" ON "bldg117862" โดยใช้ส่วนสำคัญ ("geom" gist_geometry_ops); END;


0

สมมติว่าการวางแนวของส่วนของเส้นตรงนั้นคงที่ในรูปหลายเหลี่ยมคุณสามารถคำนวณการแบก (ส่วนหัว) ของเวกเตอร์ที่ตั้งฉากกับแต่ละส่วนของเส้น ฉันไม่มีเวลาที่จะทุบตีรหัส แต่ถ้าคุณต้องการคณิตศาสตร์มันสามารถให้ได้อย่างง่ายดาย :-)

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