Tạo các dòng từ tọa độ cặp điểm với ArcPy?


11

Tôi đã có một số điểm tọa độ cặp (điểm bắt đầu và điểm kết thúc) mà tôi phải chuyển thành dòng. Cho đến bây giờ, tôi đã sử dụng một phần phụ của cả hai tọa độ trong a pippo.Point(), a pippo.CalculateGeometry()để xác định hình dạng của từng piont và pippo.append(defined geometry)để xác định cặp điểm và sau đó PointsToLine để lấy dòng của tôi. Điều này khá tốn thời gian để làm cho hàng trăm dòng.

Có một cách ngắn hơn để làm điều này?

Ví dụ: đặt điểm bắt đầu và điểm kết thúc của mỗi dòng trong các trường khác nhau của một bảng và nhập trực tiếp các dòng mà không chuyển cho hình dạng điểm.

Câu trả lời:


8

Điều này đọc một bảng (bảng Excel trong trường hợp này, nhưng có thể là bất kỳ loại bảng nào) trông giống như vậy:

nhập mô tả hình ảnh ở đây

S_X là điểm X bắt đầu, E_X kết thúc điểm X, tương tự đối với Y's. Chúng tôi lặp qua bảng đầu vào, sau đó cho mỗi hàng, đặt X / Y bắt đầu / kết thúc thành một điểm, thêm điểm đó vào một mảng, sau đó tạo một đa tuyến từ mảng hai điểm. Sau đó chèn vào featureclass. Rửa sạch và lặp lại.

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

Và bạn nhận được dòng của bạn:

nhập mô tả hình ảnh ở đây


Cảm ơn bạn, tôi sẽ thử và ước tính thời lượng phân tích của tôi .. đó chính xác là những gì tôi đã cố gắng thực hiện :-)
Annalisa Minelli

Đối với điểm dòng.X = in_row.S_X, nó trả về lỗi cho biết giá trị đầu vào không phải là số. Tôi đã cố gắng làm cho nó int hoặc float hoặc thậm chí là số nhưng không hoạt động vì trường không phải là số là Nonetype. Có ai giúp đỡ không?
Federico Gómez

5

Tôi đã tạo một tập lệnh python vào tuần trước (mặc dù không sử dụng ArcPy), lấy các điểm đang tạo hình học của các tuyến xe buýt (một điểm shp) theo trường số thứ tự ("SEQ"). Bạn có thể dễ dàng điều chỉnh nó để lấy tọa độ từ một trường có cùng tính năng (sử dụng giá trị trường thay vì hình học).

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

Mỗi cặp điểm sẽ tạo ra một dòng duy nhất. Có thể có một cách thanh lịch hơn để làm điều này, nhưng nó đã tạo ra 3900 dòng trong khoảng 15 giây để nó hoạt động với tôi ...


Cảm ơn, trông giống hệt như công phu lớn .. điều đó thực sự hữu ích với tôi. Tôi sẽ thử và sau đó phản hồi. cảm ơn vì bây giờ
Annalisa Minelli


1

đây chỉ là bản cập nhật câu trả lời của @ ChadCooper, vì các con trỏ "da" hiện đang thay thế một cách thuận lợi các con trỏ trước đó:

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]])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.