แยกจำนวนจุดยอดในแต่ละรูปหลายเหลี่ยม?


14

ฉันมี ArcGIS Desktop 10.2 และความท้าทายของฉันคือวิธีการแยกจำนวนจุดยอดในแต่ละรูปหลายเหลี่ยมสำหรับคุณสมบัติทั้งหมดดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ฉันมีพัสดุจำนวนมากในคลาสคุณลักษณะของฉันและฉันต้องการแยกจำนวนจุดยอดสำหรับคุณสมบัติทั้งหมดแยกจากนั้นฉันต้องการแสดงพิกัด XY สำหรับจุดยอดทั้งหมด

สำหรับข้อมูลเพิ่มเติมฉันแค่ต้องการแปลงจุดยอดสำหรับแต่ละรูปหลายเหลี่ยมและแสดงหมายเลขของแต่ละจุดยอดที่จ้องมองจาก 1 หมายเลขดังนั้นถ้าฉันมีรูปหลายเหลี่ยมและมีจุดยอด 4 จุดต้องการแปลงรูปหลายเหลี่ยมเป็นจุดยอดฉันแสดงจำนวนจุดยอดเช่นนี้ (1,2,3,4,5) จากนั้นแสดง xy สำหรับแต่ละจุดยอดฉันคิดว่าความท้าทายที่แท้จริงเป็นวิธีการแปลงรูปหลายเหลี่ยมทั้งหมดไปยังจุดยอดและทำให้จุดยอดแต่ละจุดเริ่มต้นจาก 1 หมายเลข


คุณต้องการให้แต่ละคุณลักษณะมี ID เฉพาะ (1 .... n) ต่อคุณลักษณะและพิกัด XY หรือไม่ตามการแก้ไขของคุณ คุณต้องการให้หนึ่งคอลัมน์ / ฟิลด์มีข้อมูลทั้งหมดนี้เพื่อวัตถุประสงค์ในการติดฉลากเช่น [1, 942744.1234, 924654.1234] [2, 952744.1234, 925654.1234] ... ?
แอรอน

ใช่ถ้าไม่ใช่ความผิดพลาดคนหนึ่งยื่นมี ID สำหรับจำนวนจุดยอดแต่ละรูปหลายเหลี่ยมเช่นนี้ (1,2,3,4), (1,2,3,4,5), (1,2,3,4) 5,6,), (1,2,3,4,5,6,7,8,9) เป็นต้นจากนั้นฉันคิดว่า xy อาจจะง่ายถ้าเราเรียกว่าเพิ่มเครื่องมือ xy จาก arctoolbox
GIS Man

คำตอบ:


5

รหัสด้านล่างรวมคำตอบอื่น ๆ และเพิ่มจำนวนจุดยอด ผล

import arcpy
arcpy.env.workspace = "in_memory"
#paths
fc = r"...\polygons"
fc_out = r"...\vertices"
arcpy.MakeFeatureLayer_management(fc, "lyr")
# add fields if needed
for FIELD in ["DRAW_ORDER", "COUNT"]:
    if FIELD not in [field.name for field in arcpy.ListFields(fc)]:
        try:
            arcpy.AddField_management("lyr", FIELD, "SHORT")
        except Exception as e:
            print e
# get the number of points minus overlapping (@dmahr - GSE)
arcpy.CalculateField_management("lyr", "COUNT", "!Shape!.pointCount-!Shape!.partCount", "PYTHON")
# dict to iterate and check count
OIDS = {}
for row in arcpy.da.SearchCursor("lyr", ["OBJECTID", "COUNT"]):
    OIDS[row[0]] = row[1]
del row
# get vertices as points and add XY (@Aaron - GSE)
arcpy.FeatureVerticesToPoints_management("lyr", fc_out)
arcpy.AddXY_management(fc_out)
# start adding a number to the points
for OID in OIDS:
    order_count = 1
    rows = arcpy.da.UpdateCursor(fc_out, ["DRAW_ORDER", "COUNT"], "ORIG_FID = %d"%OID)
    for row in rows:
        # will leave the overlapping as NULL
        if order_count <= OIDS[OID]:
            row[0] = order_count
            rows.updateRow(row)
            order_count += 1
##        # this can set the overlapping to 0 or some unique value (999)
##        else:
##            row[0] = 0
##            rows.updateRow(row)

คะแนนจะถูกระบุไว้ในลำดับการวาด จุดสุดท้าย (ใต้จุดแรก) จะไม่มีป้ายกำกับและสามารถลบได้โดยเลือกจุดทั้งหมดที่มีค่า Null หรือไม่ซ้ำกัน "DRAW_ORDER" หากไม่จำเป็นสำหรับการสร้างใหม่ สามารถใช้แบบสอบถามความหมายเพื่อลบจุดที่ทับซ้อนกันออกจากจอแสดงผล

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

ฉันยังเล่นกับ FeatureClass ไปยังแถวที่มีจำนวนมาก แต่ฉันทำมันเสร็จก่อน


ขอบคุณ @ gm70560 ฉันได้ติดตามตัวแปรรหัสของคุณและบันทึกเป็น. py แต่เมื่อฉันต้องการเรียกใช้งานข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น "ชื่อฟิลด์ที่ระบุไม่มีอยู่ในตาราง" ดังนั้นฉันจะทำอย่างไร ?
GIS Man

นี่คือหน้าจอการพิมพ์ในพีซีของฉันฉันเพิ่งตั้งค่าเส้นทางคลาสฟีเจอร์เป้าหมายและพา ธ สำหรับเอาท์พุตคลาสฟีเจอร์ใหม่ในโค้ดของคุณถ้าคุณสามารถสร้างแนวทางสำหรับการใช้รหัสของคุณimageshack.com/i/ fvsozep
ผู้ชาย GIS

ไม่ได้เพิ่มฟิลด์ (?) เกิดอะไรขึ้นต่อไปในผลลัพธ์? ฉันมีห้องแชทเพื่อทิ้งผลลัพธ์เต็ม แสดงความคิดเห็นเพื่อให้ฉันสามารถตรวจสอบห้อง
gm70560

22

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการเพิ่มเขตข้อมูลจำนวนเต็มใหม่ไปยังตารางคุณลักษณะของชั้นพัสดุ จากนั้นให้เรียกใช้เครื่องคำนวณฟิลด์ด้วยนิพจน์ต่อไปนี้:

!Shape!.pointCount-!Shape!.partCount

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

โปรดทราบว่าคุณจะต้องใช้ตัวแยกวิเคราะห์ Python เพื่อให้นิพจน์นี้ทำงาน

เครื่องคิดเลขภาคสนาม


นี่เจ๋งจริงๆ แต่จะไม่ให้ XY สำหรับจุดยอดเหล่านี้ ดูเหมือนว่าคำตอบจะใช้คำตอบทั้งคู่ (เช่น @ Aaron's) เพื่อรับข้อมูลที่ร้องขอทั้งหมด
Roland

@Roland คุณพูดถูก ... ฉันพลาดส่วนหนึ่งของคำถามเกี่ยวกับจุดยอด XY ในกรณีนี้คุณจะต้องใช้SearchCursorวิธีในคำตอบของ Aaron หรือเครื่องมือการประมวลผลทางภูมิศาสตร์เช่นFeature Vertices To Points (แม้ว่าเครื่องมือนี้ต้องมีใบอนุญาต ArcGIS for Desktop Advanced)
dmahr

ขอบคุณมาก @dmahr ฉันคิดว่ามีขั้นตอนที่ขาดหายไปเมื่อฉันคำนวณค่าผลที่ได้คือการนับจำนวนจุดยอดดังนั้นถ้าฉันมีคลาสคุณลักษณะพัสดุด้วย 5 ยอดฉันต้องการแสดงเช่นนี้ 1,2,3 4,5 ในแต่ละจุดยอดไม่นับจำนวนจุดยอดทั้งหมดความท้าทายจริงวิธีการแสดงหมายเลขสำหรับแต่ละจุดเริ่มต้นจาก 1 หมายเลขสำหรับแต่ละพัสดุ
ชาย GIS

12

dmahr ให้ทางออกที่ดีในการนับจุดยอด สำหรับวิธีที่ไม่มีการเขียนโปรแกรมเพื่อติดเลเบลแต่ละจุดด้วย XY coords ให้ลองเวิร์กโฟลว์ต่อไปนี้:

  1. แสดงจุดยอดเป็นจุด
  2. เพิ่มสองฟิลด์ใหม่ (ประเภท: สองเท่า) ในจุดใหม่ FC "X", "Y"
  3. คำนวณรูปทรงเรขาคณิต คลิกขวาที่ฟิลด์> คำนวณเรขาคณิต ... > พิกัด X ของจุด (ทำซ้ำสำหรับฟิลด์ Y)
  4. เพิ่มฟิลด์อื่น "XY" (ประเภท: ข้อความ)
  5. คำนวณเขตข้อมูล "XY" ในเครื่องคำนวณภาคสนามโดยที่ XY =

    str (! x!) + "," + str (! y!)

  6. คุณสมบัติฉลาก คลิกขวาที่เลเยอร์> ป้ายกำกับ> ฟิลด์ป้ายกำกับ: XY

สิ่งนี้สร้างผลลัพธ์ต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

คุณยังสามารถทำการกระทำเหล่านี้โดยใช้โปรแกรมexplode_to_pointsด้วยเคอร์เซอร์ค้นหา (เป็นการเริ่มต้น)

แยกโครงสร้างออกเป็นแต่ละจุดหรือจุดยอด หาก explode_to_points ถูกตั้งค่าเป็น True คุณลักษณะแบบหลายจุดที่มีห้าจุดจะแสดงด้วยห้าแถว

(ค่าเริ่มต้นคือเท็จ)

arcpy.da.SearchCursor (in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})

ดูเหมือนว่าจะต้องมีขั้นตอนการโพสต์หรือใช้คำตอบของ @ dmahr เพื่อรับผลรวมของ # ของจุดยอด
Roland

4

หากไม่ต้องการคำนวณเขตข้อมูลใหม่และต้องการรับจำนวนจุดยอดต่อเลเยอร์อย่างรวดเร็ว (เพื่อวัตถุประสงค์ทั่วไปเช่นเมื่อเปิดเผยชุดข้อมูลบนเว็บ) คุณสามารถสร้างเครื่องมือสคริปต์ที่กำหนดเองภายใน กล่องเครื่องมือหรือแสดงรหัสเป็น Python Add-in

รหัสเครื่องมือสคริปต์ที่กำหนดเอง:

import arcpy
in_fc = arcpy.GetParameterAsText(0)

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])
arcpy.AddMessage("***************************************")
arcpy.AddMessage("Number of vertices in the layer: {0}".format(count_vertices))
arcpy.AddMessage("***************************************")

Python รหัสเสริม (เลือกเลเยอร์ใน TOC เพื่อนับจุดยอด):

import arcpy
import pythonaddins

arcpy.env.overwriteOutput = True
mxd = arcpy.mapping.MapDocument("current")
in_fc = pythonaddins.GetSelectedTOCLayerOrDataFrame()

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])

pythonaddins.MessageBox(count_vertices, 'Number of vertices in {0}'.format(in_fc.name), 0)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.