Trích xuất số đỉnh trong mỗi đa giác?


14

Tôi có ArcGIS Desktop 10.2 và thử thách của tôi là làm thế nào để trích xuất các đỉnh số trong mỗi đa giác cho tất cả các tính năng như thế này:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Tôi có nhiều bưu kiện trong lớp tính năng của mình và tôi muốn trích xuất số lượng đỉnh cho tất cả các tính năng một cách riêng biệt, sau đó tôi muốn hiển thị tọa độ XY cho tất cả các đỉnh.

để biết thêm thông tin, tôi chỉ muốn chuyển đổi các đỉnh cho mỗi đa giác và số hiển thị của mỗi đỉnh nhìn từ 1 số, vì vậy nếu tôi có đa giác và nó có 4 đỉnh, muốn chuyển đổi đa giác thành các đỉnh tôi sẽ hiển thị số đỉnh như thế này (1,2,3,4,5), sau đó hiển thị xy cho mỗi đỉnh, tôi nghĩ rằng id thách thức thực sự, làm thế nào để chuyển đổi tất cả các đa giác thành các đỉnh và tạo mỗi số đỉnh bắt đầu từ 1 số.


Dựa trên chỉnh sửa của bạn, bạn có muốn mỗi tính năng có một ID duy nhất (1 .... n) cho mỗi tính năng tọa độ XY không? Bạn có muốn một cột / trường có tất cả thông tin này cho mục đích ghi nhãn, ví dụ: [1, 942744.1234, 924654.1234] [2, 952744.1234, 925654.1234] ...?
Aaron

vâng, nếu không nhầm, một người nộp có ID cho số đỉnh của mỗi đa giác như thế này (1,2,3,4), (1,2,3,4,5), (1,2,3,4, 5,6,), (1,2,3,4,5,6,7,8,9), v.v., sau đó tôi nghĩ về xy có thể dễ dàng nếu chúng ta gọi công cụ add xy từ arctoolbox
GIS Man

Câu trả lời:


5

Mã dưới đây kết hợp các câu trả lời khác và thêm một chút để đánh số các đỉnh. các kết quả

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)

Các điểm được dán nhãn theo thứ tự vẽ. Điểm cuối cùng (dưới điểm đầu tiên) sẽ không có nhãn và có thể bị xóa bằng cách chọn tất cả các điểm có giá trị Null hoặc duy nhất, "DRAW_ORDER" nếu không cần thiết để xây dựng lại. Một truy vấn định nghĩa có thể được sử dụng để loại bỏ các điểm chồng chéo khỏi màn hình.

Dữ liệu XY có mặt, nhưng tôi sẽ để nó cho nhãn của bạn / hiển thị mong muốn. Xem câu trả lời của Aaron về việc thêm trường XY để ghi nhãn.

Tôi cũng đang chơi đùa với FeatureClass với mảng numpy, nhưng tôi đã hoàn thành nó đầu tiên.


cảm ơn bạn @ gm70560, tôi đã theo dõi các biến mã của bạn và lưu nó dưới dạng .py, nhưng khi tôi muốn thực thi nó, một thông báo lỗi xuất hiện, "Tên trường được chỉ định không tồn tại trong bảng", vậy tôi có thể làm gì ?
Người đàn ông GIS

Đây là một màn hình in trên máy tính của tôi, tôi chỉ đặt đường dẫn lớp tính năng đích và đường dẫn cho lớp tính năng mới đầu ra, trong mã của bạn, nếu bạn có thể tạo một hướng dẫn về cách sử dụng mã của mình, imageshack.com/i/ fvsozep
Người đàn ông GIS

Nó không thêm trường (?). Điều gì đã xảy ra hơn nữa trong kết quả? Tôi có một phòng chat để đổ kết quả đầy đủ. Để lại một bình luận để tôi có thể kiểm tra phòng.
gm70560

22

Cách dễ nhất để làm điều này là thêm một trường số nguyên mới vào bảng thuộc tính của lớp bưu kiện. Sau đó, chạy máy tính trường với biểu thức sau:

!Shape!.pointCount-!Shape!.partCount

Trả !Shape!.pointCountvề tổng số đỉnh trong tính năng. Tuy nhiên, đỉnh đầu tiên của mỗi phần được lặp lại ở cuối, để đóng tính năng. Để xử lý điều này, hãy trừ một đỉnh cho mỗi phần bằng cách sử dụng -!Shape!.partCount.

Lưu ý rằng bạn sẽ phải sử dụng trình phân tích cú pháp Python để biểu thức này hoạt động.

Máy tính hiện trường


điều này thực sự khá tuyệt, nhưng sẽ không cung cấp XY cho mỗi đỉnh này. Có vẻ như câu trả lời sẽ là sử dụng cả hai câu trả lời (tức là cả @ Aaron) để nhận tất cả thông tin được yêu cầu.
Roland

@Roland Bạn nói đúng ... Tôi đã bỏ lỡ một phần câu hỏi về các đỉnh XY. Trong trường hợp đó, bạn sẽ phải sử dụng SearchCursorphương pháp trong câu trả lời của Aaron hoặc một công cụ xử lý địa lý như Feature Vertices To Points (mặc dù công cụ này yêu cầu giấy phép ArcGIS for Desktop Advanced).
dmahr

cảm ơn bạn rất nhiều , 4,5 trên mỗi đỉnh, không tính tất cả các đỉnh trong một số, thách thức thực sự của nó, cách hiển thị số cho mỗi đỉnh bắt đầu từ 1 số cho mỗi bưu kiện.
Người đàn ông GIS

12

dmahr cung cấp một giải pháp tốt để đếm các đỉnh. Để biết cách không lập trình để gắn nhãn cho từng điểm bằng các chuỗi XY, hãy thử quy trình làm việc sau:

  1. Tính năng Vertice to Points
  2. Thêm hai trường mới (loại: gấp đôi) trong điểm mới FC "X", "Y"
  3. Tính toán hình học. Trường nhấp chuột phải> Tính toán hình học ...> X Tọa độ điểm (lặp lại cho trường Y)
  4. Thêm một trường khác "XY" (loại: Văn bản)
  5. Tính toán trường "XY" trong máy tính trường, trong đó XY =

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

  6. Tính năng nhãn. Nhấp chuột phải vào lớp> Nhãn> Trường nhãn: XY

Điều này tạo ra các kết quả sau:

nhập mô tả hình ảnh ở đây

Bạn cũng có thể thực hiện những hành động lập trình sử dụng explode_to_pointsvới một con trỏ tìm kiếm (như một sự khởi đầu).

Giải mã một tính năng thành các điểm hoặc đỉnh riêng lẻ của nó. Nếu explode_to_point được đặt thành True, chẳng hạn, tính năng đa điểm có năm điểm, được biểu thị bằng năm hàng.

(Giá trị mặc định là Sai)

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

có vẻ như người ta sẽ cần một số quy trình đăng bài hoặc sử dụng câu trả lời của @ dmahr để có được tổng kết theo từng tính năng của # đỉnh.
Roland

4

Nếu người ta không muốn tính toán một trường mới và chỉ muốn lấy lại một số đỉnh trên mỗi lớp một cách nhanh chóng (với mục đích khái quát hóa như khi hiển thị các bộ dữ liệu trên web), thì có thể tạo một công cụ tập lệnh tùy chỉnh bên trong một hộp công cụ hoặc hiển thị mã dưới dạng bổ trợ Python.

Mã công cụ tập lệnh tùy chỉnh:

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("***************************************")

Mã bổ trợ Python (chọn một lớp trong TOC để đếm các đỉnh):

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)
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.