Dapatkan semua poin polyline


11

Saya memiliki beberapa objek fitur polyline di python. Sekarang saya ingin mendapatkan semua poin dari polyline.

Misalnya, jika polyline memiliki titik [0,0]akhir titik awal [5,5]. Hasil: [1,1];[2,2];[3,3];[4,4];[5,5].

Saya ingin menemukan semua titik integer pada garis itu termasuk titik akhir. Untuk garis lurus ini sangat sederhana, tetapi jika polyline memiliki Beizer Curve, Circular Arc, jenis geometri Elliptic Arc, lalu bagaimana saya bisa melakukannya?

EDIT:

Saya hanya dapat menggunakan alat-alat yang tersedia di semua tingkat lisensi ArcGIS. Misalnya, ArcGIS Basic.


2
Secara umum Anda tidak akan sering mendapatkan poin 'bilangan bulat' yang bagus. Ini berfungsi dalam contoh Anda, tetapi tidak sering dalam kehidupan nyata. Biasanya, Anda hanya mendapatkan lokasi untuk simpul, jadi dalam kasus Anda, Anda akan mendapatkan [0,0] dan [5,5]. Poin 'perantara' dapat 'diasumsikan'. Tidak yakin bagaimana melakukan ini dengan python, tetapi beberapa alat akan memungkinkan Anda untuk membuat file titik simpul dari sebuah garis.
Darren Cope

Jawaban:


18

Saya tahu ini sudah lama tetapi saya mencari yang sama karena saya tidak memiliki ArcInfo untuk alat FeatureVerticesToPoints . Setelah menggunakan solusi kursor Pencarian di atas, saya maju untuk menyederhanakan kode dan menemukan bahwa menggunakan NumPy Array dalam Modul Akses Data, skrip sederhana dan sangat cepat dapat dihasilkan. Saya menggunakan ini sebagai alat skrip.

Catatan: Kuncinya adalah explode_to_pointsparameter dalamarcpy.da.FeatureClassToNumPyArray

Berikut ini tautan ke Lokasi Repositori ArcGIS: Kelas Fitur ke Poin

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

Selamat datang di GIS.se Paul :) +1 untuk kontribusi pertama yang berpengetahuan luas dan lebih baik daripada rata-rata, dengan kode untuk boot. Terima kasih! Beberapa kiat pengeditan: pilih teks, sebaris, atau blok, lalu ctrl-kterapkan pemformatan kode (sama untuk yang blama dan italik). Dengan konvensi kita cenderung menghindari bit cerewet seperti "hai", "terima kasih", "ceria". Itu tersirat sebagai selalu hadir, dan membantu memperkuat ide tempat ini berbeda dari forum dan email biasa. Selamat bergabung.
matt wilkie

Anda harus meletakkan placeholder untuk where_clause pada baris array kode ini = arcpy.da.FeatureClassToNumPyArray (InFc, ["SHAPE @ XY"], "", spatial_reference = SR, explode_to_points = True)
Tristan Forward

4

Seperti yang saya pahami, Anda perlu meningkatkan jumlah simpul untuk fitur polyline Anda. Dan juga untuk mengubah semua segmen "Beizer Curve, Circular Arc, Elliptic Arc" menjadi beberapa segmen garis.

Untuk tugas ini di ArcGIS Anda dapat menggunakan alat Densify (Editing) di ArcToolbox.

Kemudian Anda dapat mengonversi simpul poline Anda ke fitur titik seperti yang disarankan Darren Cope dan artwork21.

Jika Anda lebih suka melakukannya di ArcMap, lihat Membuat poin baru di sepanjang topik bantuan baris .


3

Yang berikut ini harus bekerja pada polylines dan polygon:

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

Untuk beberapa data jalan UK, saya mendapatkan ini; daftar X, Y berpasangan untuk setiap titik yang membentuk polyline:

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]]

Saya pernah melihat ini di halaman ESRI. Tetapi jika Anda melihat dengan seksama dalam deskripsi mereka kode ini hanya mengembalikan titik akhir, bukan titik di antara mereka
pengguna

2
@crucifiedsoul - Ya, ini adalah variasi dari sampel ESRI itu , tetapi memberikan X, Y pasangan semua poin, bukan hanya titik akhir. Itu yang Anda inginkan, benar?
Chad Cooper

Saya tidak mengerti. Satu-satunya hal yang berubah Anda mengganti print pnt.X, pnt.Ydengan part_list.append([pnt.X, pnt.Y]). Dan Anda mencetak ini di akhir perulangan. Bagaimana kode Anda mendapatkan semua poin dari satu baris tetapi kode ESRI tidak?
pengguna

Metode yang dijelaskan tidak bekerja untuk saya. Saya hanya perlu menentukan bidang bentuk saya - arcpy.da.SearchCursor (fc, ["SHAPE @"])
jbalk

1

Seperti yang disarankan Darren Cope, mengonversi lapisan Anda ke titik titik dapat dilakukan menggunakan alat Fitur Titik ke Poin .

Berikut ini adalah kode python 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")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.