Створення ліній з координат парних точок з ArcPy?


11

У мене є кілька координат парних точок (початкова і кінцева точки), які я повинен перетворити на лінії. До цих пір я використовував додавання обох координат у a pippo.Point(), a pippo.CalculateGeometry()для визначення геометрії кожного піонта та pippo.append(defined geometry)для визначення пари точок, а потім PointsToLine для отримання моєї лінії. Це досить дорого зробити для сотень ліній.

Чи є коротший спосіб зробити це?

Наприклад, розмістіть початкову та кінцеву точку кожного рядка в різних полях однієї таблиці та імпортуйте рядки безпосередньо, не проходячи геометрію точок.

Відповіді:


8

Це читає таблицю (у цьому випадку аркуш Excel, але може бути будь-якого типу таблиці), яка виглядає так:

введіть тут опис зображення

S_X - початкова точка X, E_X кінцева точка X, однакова для Y. Проводимо ітерацію через таблицю введення, потім для кожного рядка встановлюємо початок / кінець X / Ys в точку, додаємо цю точку до масиву, а потім створюємо поліліній з масиву двох точок. Потім вставте в клас класів. Промийте і повторіть.

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

І ви отримуєте свої рядки:

введіть тут опис зображення


Дякую, я спробую оцінити тривалість мого аналізу. Це було саме те, що я намагався зробити :-)
Анналіса Мінеллі

Для рядкової точки.X = in_row.S_X вона повертає помилку, кажучи, що вхідне значення не є числовим. Я намагався зробити це int або float або навіть числовим, але не працює, тому що поле не є числом Nonetype. Будь-яка допомога?
Федеріко Гомес

5

На минулому тижні я створив сценарій python (не використовуючи ArcPy), який займає точки, які створюють геометрію шинних ліній (точка shp) відповідно до поля послідовного числа ("SEQ"). Ви можете легко налаштувати його, щоб взяти координату з поля тієї ж функції (використовуючи значення поля замість геометрії).

# -*- 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"

Кожна пара точок створить єдиний рядок. Можливо, є більш елегантний спосіб зробити це, але він створив 3900 рядків приблизно за 15 секунд, так що це працює для мене ...


Дякую, виглядає точно як масштабна розробка .. що має бути дуже корисним для мене. Я спробую, а потім відгуки. дякую зараз.
Анналіса Мінеллі


1

це лише оновлення відповіді @ ChadCooper, оскільки курсори "так" зараз вигідно замінюють попередні курсори:

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]])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.