Создание линий из точек пары координат с ArcPy?


11

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

Есть ли более короткий способ сделать это?

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

Ответы:


8

Это читает таблицу (в данном случае лист Excel, но может быть любого типа таблицы), которая выглядит так:

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

S_X - начальная точка X, E_X - конечная точка X, то же самое для Y. Мы перебираем входную таблицу, затем для каждой строки устанавливаем начальные / конечные значения X / Y в точку, добавляем эту точку в массив, затем создаем полилинию из массива из двух точек. Затем вставьте в класс объектов. Промыть и повторить.

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

И вы получите свои строки:

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


Спасибо, я постараюсь оценить продолжительность моего анализа .. это было именно то, что я пытался сделать :-)
Annalisa Minelli

Для строки point.X = in_row.S_X возвращается ошибка о том, что входное значение не является числовым. Я попытался сделать это int или float или даже числовым, но не работает, потому что поле не является числом Нетип. Любая помощь?
Федерико Гомес

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, потому что курсоры "da" теперь выгодно заменяют предыдущие курсоры:

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.