ArcPy를 사용하여 점 쌍 좌표에서 선을 생성합니까?


11

선으로 변환 해야하는 점 쌍 좌표 (시작 및 끝 지점)가 있습니다. 지금까지, 나는 두 좌표의 APPEND를 사용 pippo.Point()하는이 pippo.CalculateGeometry()각 piont의 구조를 정의하고, 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

그리고 당신은 당신의 라인을 얻을 :

여기에 이미지 설명을 입력하십시오


감사합니다, 나는 내가 :-)하려고 노력 정확히 무엇을했다 .. 시도하고 내 분석의 기간을 추정 할 수 있습니다
아날 리사 미넬리

line point.X = in_row.S_X의 경우 입력 값이 숫자가 아니라는 오류를 반환합니다. int 또는 float 또는 숫자로 만들려고했지만 필드가 숫자가 아니기 때문에 작동하지 않습니다. 어떤 도움?
Federico Gómez

5

지난주에 파이썬 스크립트 (ArcPy를 사용하지는 않음)를 만들었습니다. 순차 번호 필드 ( "SEQ")에 따라 버스 라인의 지오메트리 (포인트 shp)를 생성하는 포인트를 사용합니다. 동일한 피쳐의 필드에서 좌표를 가져 오도록 쉽게 조정할 수 있습니다 (지오메트리 대신 필드 값 사용).

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

각 점 쌍은 단일 선을 만듭니다. 더 우아한 방법이있을 수 있지만 약 15 초 안에 3900 줄을 만들었으므로 나에게 효과적입니다 ...


고마워요, 엄청나게 정교 해 보입니다. 정말 유용합니다. 노력하고 피드백을 보내겠습니다. 고마워
Annalisa Minelli


1

"da"커서가 이제 이전 커서를 유리하게 대체하기 때문에 이것은 @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]])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.