Puanlardan satır oluşturma ArcPy ile koordinat çifti?


11

Çizgilere dönüştürmem gereken bazı noktalar çifti koordinatları (başlangıç ​​ve bitiş noktaları) var. Şimdiye kadar , her bir piont'un geometrisini tanımlamak ve nokta çiftini tanımlamak için a pippo.Point(), pippo.CalculateGeometry()a'daki her iki koordinatın bir ucunu pippo.append(defined geometry)ve ardından çizgimi elde etmek için PointsToLine'ı kullandım. Bu yüzlerce hat için oldukça pahalı.

Bunu yapmanın daha kısa bir yolu var mı?

Örneğin, her satırın başlangıç ​​ve bitiş noktalarını tek bir tablonun farklı alanlarına yerleştirin ve noktaları nokta geometrisini geçmeden doğrudan içe aktarın.

Yanıtlar:


8

Bu, aşağıdaki gibi görünen bir tablo (bu durumda Excel sayfası, ancak herhangi bir tablo türü olabilir) okur:

resim açıklamasını buraya girin

S_X başlangıç ​​X noktası, E_X bitiş X noktası, Y'ler için aynıdır. Giriş tablosunu yineliyoruz, ardından her satır için başlangıç ​​/ bitiş X / Y'lerini bir noktaya ayarlıyoruz, bu noktayı bir diziye ekliyoruz, ardından iki nokta dizisinden bir çoklu çizgi oluşturuyoruz. Ardından özellik sınıfına yerleştirin. Durulayın ve tekrarlayın.

import arcpy

in_rows = arcpy.SearchCursor(r"D:\Temp\Lines.xls\Sheet1$")

point = arcpy.Point()
array = arcpy.Array()

featureList = []
cursor = arcpy.InsertCursor(r"D:\Temp\Lines.shp")
feat = cursor.newRow()

for in_row in in_rows:
    # Set X and Y for start and end points
    point.X = in_row.S_X
    point.Y = in_row.S_Y
    array.add(point)
    point.X = in_row.E_X
    point.Y = in_row.E_Y
    array.add(point)   
    # Create a Polyline object based on the array of points
    polyline = arcpy.Polyline(array)
    # Clear the array for future use
    array.removeAll()
    # Append to the list of Polyline objects
    featureList.append(polyline)
    # Insert the feature
    feat.shape = polyline
    cursor.insertRow(feat)
del feat
del cursor

Ve hatlarınızı alıyorsunuz:

resim açıklamasını buraya girin


Teşekkür ederim, deneyeceğim ve analizimin süresini tahmin edeceğim .. Tam olarak yapmaya çalıştığım şey buydu :-)
Annalisa Minelli

Satır noktası.X = in_row.S_X için, giriş değerinin sayısal olmadığını söyleyen bir hata döndürür. Ben int ya da float ya da hatta sayısal yapmaya çalıştım ama alan bir sayı olmadığı için çalışmıyor Nonetype. Herhangi bir yardım?
Federico Gómez

5

Geçen hafta (ardışık sayı alanı ("SEQ") göre otobüs hatları geometrisi (bir nokta shp) oluşturan puan alır (ArcPy kullanarak değil), bir python komut dosyası oluşturdum. Aynı özelliğin bir alanından (geometri yerine alan değerini kullanarak) koordinatı almak için kolayca değiştirebilirsiniz.

# -*- coding: utf-8 -*-
###############################################################################
from sys import argv
import osgeo.ogr
import os, os.path
###############################################################################

script, srcSHP = argv

#-- Open source shapefile
shapefile = osgeo.ogr.Open(srcSHP)
layer = shapefile.GetLayer(0)
spatialRef = layer.GetSpatialRef()

#-- Output directory
outDir = os.path.dirname(srcSHP)
outDirName = os.path.basename(outDir)

driver = osgeo.ogr.GetDriverByName("ESRI Shapefile")
outFile = driver.CreateDataSource(os.path.join(outDir,outDirName + "_lines.shp"))
outLayer = outFile.CreateLayer("layer", spatialRef)

#-- Adding fields to the output shapefile
fieldDef = osgeo.ogr.FieldDefn("line_no", osgeo.ogr.OFTString)
fieldDef.SetWidth(12)
outLayer.CreateField(fieldDef)

fieldDef = osgeo.ogr.FieldDefn("From_SEQ", osgeo.ogr.OFTReal)
outLayer.CreateField(fieldDef)

fieldDef = osgeo.ogr.FieldDefn("To_SEQ", osgeo.ogr.OFTReal)
outLayer.CreateField(fieldDef)

#-- Going through each feature, one by one
#-- The last point is the end of the line so I don't want to iterate through that one
for i in range(layer.GetFeatureCount()-1):
    lString = osgeo.ogr.Geometry(osgeo.ogr.wkbLineString)  

    feature1 = layer.GetFeature(i)
    feature2 = layer.GetFeature(i+1)

    # When it's a new line, the sequential number restart to 1, so we don't want that line
    if feature1.GetField("SEQ") < feature2.GetField("SEQ"):
        geom1 = feature1.GetGeometryRef()
        geom2 = feature2.GetGeometryRef()

        geom1x = geom1.GetX()
        geom1y = geom1.GetY()
        geom2x = geom2.GetX()
        geom2y = geom2.GetY()

        lString.AddPoint(geom1x, geom1y)
        lString.AddPoint(geom2x, geom2y)     # Adding the destination point

        #-- Adding the information from the source file to the output
        feat = osgeo.ogr.Feature(outLayer.GetLayerDefn())
        feat.SetGeometry(lString)
        feat.SetField("line_no", feature1.GetField("line_no"))
        feat.SetField("From_SEQ", feature1.GetField("SEQ"))
        feat.SetField("To_SEQ", feature2.GetField("SEQ"))
        outLayer.CreateFeature(feat)

print "The End"

Her nokta çifti tek bir çizgi oluşturur. Bunu yapmanın daha zarif bir yolu olabilir, ancak yaklaşık 15 saniyede 3900 satır oluşturdu, bu yüzden benim için çalışıyor ...


Teşekkürler, tam olarak kitlesel ayrıntılara benziyor .. bu benim için gerçekten yararlı olmalı. Ben deneyeceğim ve sonra geribildirim. şimdilik teşekkürler.
Annalisa Minelli


1

bu @ ChadCooper'ın cevabının sadece bir güncellemesidir, çünkü "da" imleçleri artık avantajlı bir şekilde önceki imleçlerin yerini almaktadır:

with arcpy.da.SearchCursor(input_table,[orig_namefield,x1,y1,x2,y2] ) as in_rows:
    with arcpy.da.InsertCursor(output_lines,["SHAPE@",name_field]) as cursor:
        for row in in_rows:
            # build array for line segment
            array = arcpy.Array([arcpy.Point(row[1],row[2]),arcpy.Point(row[3],row[4])])
            # Create a Polyline object based on the array of points
            polyline = arcpy.Polyline(array)
            # Insert the feature
            cursor.insertRow([polyline,row[0]])
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.