การสร้างเส้นจากพิกัดจุดจับคู่กับ ArcPy?


11

ฉันมีบางจุดที่จับคู่พิกัด (จุดเริ่มต้นและจุดสิ้นสุด) ซึ่งฉันต้องแปลงเป็นเส้น จนถึงตอนนี้ฉันใช้ส่วนต่อท้ายของพิกัดทั้งสองใน a pippo.Point(), a pippo.CalculateGeometry()เพื่อกำหนดรูปทรงเรขาคณิตของแต่ละ piont และpippo.append(defined geometry)เพื่อระบุคู่ของจุดแล้ว PointsToLine เพื่อรับสายของฉัน นี่เป็นเวลาค่อนข้างแพงในการทำหลายร้อยบรรทัด

มีวิธีที่สั้นกว่านี้หรือไม่?

ตัวอย่างเช่นวางจุดเริ่มต้นและจุดสิ้นสุดของแต่ละบรรทัดในเขตข้อมูลที่แตกต่างกันของตารางเดียวและนำเข้าบรรทัดโดยตรงโดยไม่ผ่านสำหรับจุดเรขาคณิต

คำตอบ:


8

นี่เป็นการอ่านตาราง (แผ่นงาน Excel ในกรณีนี้ แต่อาจเป็นประเภทตารางใดก็ได้) ที่มีลักษณะดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

S_X คือจุดเริ่มต้น X, E_X จุดสิ้นสุด X เหมือนกันกับของ Y เราวนซ้ำผ่านตารางอินพุตจากนั้นสำหรับแต่ละแถวตั้งค่าเริ่มต้น / สิ้นสุด X / Ys เป็นจุดเพิ่มจุดนั้นไปยังอาร์เรย์จากนั้นสร้าง polyline จากอาร์เรย์สองจุด จากนั้นแทรกลงใน featureclass ล้างและทำซ้ำ

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

สำหรับจุดบรรทัด X = in_row.S_X จะส่งคืนข้อผิดพลาดที่แจ้งว่าค่าที่ป้อนไม่ใช่ตัวเลข ฉันพยายามทำให้มันเป็น int หรือ float หรือเป็นตัวเลข แต่ไม่ได้ผลเพราะ field ไม่ใช่ตัวเลขคือ Nonetype ความช่วยเหลือใด ๆ
Federico Gómez

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 วินาทีเพื่อให้เหมาะกับฉัน ...


ขอบคุณดูเหมือนว่าการบรรจงอย่างมาก .. ที่ควรจะเป็นประโยชน์กับฉันจริงๆ ฉันจะลองแล้วตอบรับ ขอบคุณสำหรับตอนนี้
Annalisa Minelli

3

คุณสามารถใช้เครื่องมือทั้งสองนี้สร้างเลเยอร์เหตุการณ์ XYและPoints to lineโดยดูพารามิเตอร์ที่ต้องการในจุดต่อบรรทัด (ฟิลด์บรรทัดจุดเรียงลำดับ) และอัปเดตข้อมูลตารางอินพุตงานอาจง่ายขึ้น


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]])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.