Bir çoklu çizginin tüm noktalarını alın


11

Python bazı polyline özellik nesneleri var. Şimdi ben polinillerin tüm noktalarını elde etmek istiyorum.

Örneğin, bir çoklu çizginin başlangıç ​​noktası [0,0]bitiş noktası varsa [5,5]. Sonuç: [1,1];[2,2];[3,3];[4,4];[5,5].

Bitiş noktaları dahil olmak üzere o satırdaki tüm tamsayı noktalarını bulmak istiyorum. Düz çizgi için bu çok basittir, ancak eğer çoklu çizgide Beizer Eğrisi, Dairesel Ark, Eliptik Ark geometrisi türleri varsa, bunu nasıl yapabilirim?

DÜZENLE:

Yalnızca ArcGIS'in tüm lisans seviyelerinde bulunan araçları kullanabilirim. Örneğin, ArcGIS Basic.


2
Genel olarak hoş bir 'tamsayı' puanı elde edemezsiniz. Örneğinizde çalışır, ancak gerçek hayatta sık değildir. Genellikle, yalnızca köşeler için konumlar alırsınız, bu durumda [0,0] ve [5,5] elde edersiniz. 'Ara' noktalar 'kabul edilebilir'. Bunu python'da nasıl yapacağınızdan emin değilim, ancak birkaç araç bir satırdan köşelerin bir nokta dosyasını oluşturmanıza izin verecektir.
Darren Cope

Yanıtlar:


18

Bu eski olduğunu biliyorum ama FeatureVerticesToPoints araçları için ArcInfo yok aynı arıyordu . Yukarıdaki Arama imleç çözümünü kullandıktan sonra, kodu basitleştirmek için ileri gittim ve Veri Erişim Modülündeki NumPy Dizilerini kullanarak basit ve çok hızlı bir komut dosyası üretilebileceğini buldum. Bunu bir betik aracı olarak kullanıyorum.

Not: anahtar explode_to_pointsparametrearcpy.da.FeatureClassToNumPyArray

İşte ArcGIS Deposu Konumuna bağlantı: Özellik Sınıfı Puanlar

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

Önyükleme kodu ile iyi bir yuvarlak ve ortalama ilk katkıdan daha iyi için GIS.se Paul :) + 1'ye hoş geldiniz . Teşekkürler! Bazı düzenleme ipuçları: metin, satır içi veya blok seçin ve ardından ctrl-kkod biçimlendirmesi uygulamak ( beski ve itaik için aynıdır ). Kongre ile "merhaba", "teşekkürler", "şerefe" gibi konuşkan bitlerden kaçınma eğilimindeyiz. Bunlar her zaman mevcut olarak ima edilir ve bu yerin her zamanki forumlardan ve e-postalardan farklı olduğu fikrini güçlendirmeye yardımcı olur. Gemiye Hoşgeldiniz.
matt wilkie

Bu dizi dizisi için where_clause için bir yer tutucu koymanız gerekir = arcpy.da.FeatureClassToNumPyArray (InFc, ["SHAPE @ XY"], "", spatial_reference = SR, explode_to_points = True)
Tristan Forward

4

Anladığım kadarıyla, çoklu hat özellikleriniz için köşe sayısını artırmanız gerekiyor. Ve ayrıca tüm "Beizer Curve, Circular Arc, Eliptik Arc" parçalarını birkaç çizgi parçasına dönüştürmek.

ArcGIS'deki bu görev için ArcToolbox'ta Yoğunlaştır (Düzenleme) aracını kullanabilirsiniz.

Ardından, çoklu çizgilerinizin köşelerini önerilen Darren Cope ve sanat eserleri21 gibi nokta özelliklerine dönüştürebilirsiniz21 .

ArcMap'te yapmayı tercih ediyorsanız, bir çizgi yardım konusu boyunca yeni noktalar oluşturma konusuna bakın.


3

Polietilenler ve çokgenler üzerinde aşağıdakiler çalışmalıdır:

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

Bazı Birleşik Krallık yol verileri için bunu anlıyorum; çoklu çizgiyi oluşturan her köşe için X, Y çiftlerinin iç içe bir listesi:

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

Bunu ESRI sayfasında gördüm. Ancak açıklamalarına dikkatlice bakarsanız, bu kod aralarındaki noktaları değil, yalnızca bitiş noktalarını döndürür
kullanıcı

2
@crucifiedsoul - Evet, bu ESRI örneğinin bir varyasyonu , ancak yalnızca bitiş noktalarını değil, tüm noktaların X, Y çiftini verir. İstediğin bu, değil mi?
Chad Cooper

Anlamıyorum. Tek şey değiştiriyorsanız değişiyor print pnt.X, pnt.Yile part_list.append([pnt.X, pnt.Y]). Ve bunu döngünün sonunda yazdırıyorsunuz. Kodunuz bir satırın tüm noktalarını nasıl alabilir, ancak ESRI kodu nasıl alamaz?
kullanıcı

Tarif yöntemi benim için işe yaramadı. Sadece şekil alanımı belirtmek zorunda kaldım - arcpy.da.SearchCursor (fc, ["SHAPE @"])
jbalk

1

Darren Cope'nin önerdiği gibi, katmanınızı nokta köşelerine dönüştürmek Özellik Noktalarını Noktalara Aracı kullanılarak yapılabilir .

İşte snipt python kodu:

# 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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.