Nhận tất cả các điểm của một đa tuyến


10

Tôi có một số đối tượng tính năng polyline trong python. Bây giờ tôi muốn có được tất cả các điểm của polylines.

Ví dụ: nếu một đa tuyến có điểm [0,0]kết thúc điểm bắt đầu [5,5]. Kết quả : [1,1];[2,2];[3,3];[4,4];[5,5].

Tôi muốn tìm tất cả các điểm nguyên trên dòng đó bao gồm cả điểm cuối. Đối với đường thẳng, điều này rất đơn giản, nhưng nếu polyline có các dạng hình học Beizer Curve, tròn Arc, Elliptic Arc, thì tôi có thể làm như thế nào?

BIÊN TẬP:

Tôi chỉ có thể sử dụng những công cụ có sẵn trong tất cả các cấp giấy phép của ArcGIS. Ví dụ: ArcGIS Basic.


2
Nói chung, bạn sẽ không nhận được điểm 'số nguyên' đẹp. Nó hoạt động trong ví dụ của bạn, nhưng không thường xuyên trong cuộc sống thực. Thông thường, bạn chỉ cần lấy vị trí cho các đỉnh, vì vậy trong trường hợp của bạn, bạn sẽ nhận được [0,0] và [5,5]. Điểm 'trung gian' có thể là 'giả định'. Không chắc chắn làm thế nào để làm điều này trong python, nhưng một số công cụ sẽ cho phép bạn tạo một tệp điểm của các đỉnh từ một dòng.
Darren đối đầu

Câu trả lời:


17

Tôi biết cái này đã cũ nhưng tôi đang tìm kiếm giống như tôi không có ArcInfo cho các công cụ FeatureVerticesToPoints . Sau khi sử dụng giải pháp con trỏ Tìm kiếm ở trên, tôi đã tiếp tục đơn giản hóa mã và thấy rằng sử dụng NumPy Mảng trong Mô-đun truy cập dữ liệu có thể tạo ra một tập lệnh đơn giản và rất nhanh. Tôi đang sử dụng điều này như một công cụ kịch bản.

Lưu ý: Chìa khóa là explode_to_pointstham số trongarcpy.da.FeatureClassToNumPyArray

Đây là liên kết đến Vị trí kho lưu trữ ArcGIS: Lớp tính năng đến điểm

# Feature Class to Points
# 
# Paul Smith (2012) paul@neoncs.com.au

# Imports
import arcpy
import numpy

#Inputs from user parameters
InFc  = arcpy.GetParameterAsText(0) # input feature class
OutFc = arcpy.GetParameterAsText(1) # output feature class

# Spatial reference of input feature class
SR = arcpy.Describe(InFc).spatialReference

# Create NumPy array from input feature class
array = arcpy.da.FeatureClassToNumPyArray(InFc,["SHAPE@XY"], spatial_reference=SR, explode_to_points=True)

# Check array and Exit if no features found
if array.size == 0:
    arcpy.AddError(InFc + " has no features.")

# Create a new points feature class
else:
    arcpy.da.NumPyArrayToFeatureClass(array, OutFc, ['SHAPE@XY'], SR)

Chào mừng bạn đến với GIS.se Paul :) +1 cho một đóng góp tốt và tốt hơn so với đóng góp đầu tiên trung bình, với mã để khởi động. Cảm ơn! Một số mẹo chỉnh sửa: chọn văn bản, nội tuyến hoặc một khối, sau đó ctrl-káp dụng định dạng mã (tương tự cho bcũ và iTalic). Theo quy ước, chúng tôi có xu hướng tránh các bit trò chuyện như "hi", "cảm ơn", "chúc mừng". Những người được ngụ ý là luôn luôn có mặt, và giúp củng cố ý tưởng nơi này khác với các diễn đàn và email thông thường. Chào mừng bạn
matt wilkie

Bạn cần phải đặt một giữ chỗ cho where_clause trên dòng này của mảng code = arcpy.da.FeatureClassToNumPyArray (InFc, [ "SHAPE @ XY"], "", spatial_reference = SR, explode_to_points = True)
Tristan Forward

4

Theo tôi hiểu, bạn cần tăng số lượng đỉnh cho các tính năng đa tuyến của mình. Và cũng để chuyển đổi tất cả các phân đoạn "Beizer Curve, Tròn Arc, Elliptic Arc" thành một số phân khúc dòng.

Đối với tác vụ này trong ArcGIS, bạn có thể sử dụng công cụ Densify (Chỉnh sửa) trong ArcToolbox.

Sau đó, bạn có thể chuyển đổi các đỉnh của polylines thành các tính năng như đề xuất Darren đối tác và tác phẩm nghệ thuật21.

Nếu bạn thích làm điều đó trong ArcMap, hãy xem Tạo điểm mới cùng với chủ đề trợ giúp về dòng .


3

Sau đây nên hoạt động trên polylines và đa giác:

import arcpy

infc = r"D:\Projects\GDBs\slowbutter.gdb\fc"

desc = arcpy.Describe(infc)
shapefieldname = desc.ShapeFieldName

rows = arcpy.SearchCursor(infc)
for row in rows:
    # Create the geometry object
    feat = row.getValue(shapefieldname)
    print "Feature %i: " % row.getValue(desc.OIDFieldName)
    partnum = 0
    # Step through each part of the feature
    for part in feat:
        print "Part %i: " % partnum
        part_list = []
        for pnt in feat.getPart(partnum):
            if pnt:
                # Add to list
                part_list.append([pnt.X, pnt.Y])
            else:
                # If pnt is None, this represents an interior ring
                print "Interior Ring:"
        partnum += 1  
        print part_list

Đối với một số dữ liệu đường bộ của Vương quốc Anh, tôi nhận được điều này; một danh sách lồng các cặp X, Y cho mỗi đỉnh tạo nên đa tuyến:

Feature 7: 
Part 0: 
[[-0.48053999999996222, 51.482510000000048], [-0.48032999999992398, 
51.482609000000082], [-0.48026999999996178, 51.48273800000004], 
[-0.48043999999993048, 51.482891000000052], [-0.48065999999994347, 51.482948000000079],
[-0.48123999999995704, 51.483009000000038]]

Tôi đã thấy điều này trên trang ESRI. Nhưng nếu bạn xem xét kỹ trong mô tả của họ, mã này chỉ trả về điểm cuối chứ không phải điểm giữa họ
người dùng

2
@crucifiedsoul - Có, đây là một biến thể của mẫu ESRI đó , nhưng nó cung cấp cho cặp X, Y của tất cả các điểm, không chỉ các điểm cuối. Đó là những gì bạn muốn, đúng không?
Chad Cooper

Tôi không hiểu Điều duy nhất là thay đổi bạn đang thay thế print pnt.X, pnt.Ybằng part_list.append([pnt.X, pnt.Y]). Và bạn đang in cái này ở cuối vòng lặp. Làm thế nào mã của bạn có thể có được tất cả các điểm của một dòng nhưng mã ESRI không?
người dùng

Phương pháp mô tả không hiệu quả với tôi. Tôi phải chỉ định trường hình dạng của mình - arcpy.da.SearchCoder (fc, ["SHAPE @"])
jbalk

1

Như Darren đối tác đã đề xuất, việc chuyển đổi lớp của bạn thành một đỉnh điểm có thể được thực hiện bằng cách sử dụng công cụ Tính năng điểm thành điểm .

Đây là mã trăn snippedt:

# import system modules 
import arcpy
from arcpy import env

# Set environment settings
env.workspace = "C:/data"

# Set local variables
inFeatures = "majorrds.shp"
outFeatureClass = "c:/output/output.gdb/majorrds_midpt"

# Execute FeatureVerticesToPoints
arcpy.FeatureVerticesToPoints_management(inFeatures, outFeatureClass, "MID")
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.