폴리 라인의 모든 포인트를 얻습니다


11

파이썬에는 폴리 라인 피처 객체가 있습니다. 이제 폴리 라인의 모든 포인트를 얻고 싶습니다.

예를 들어, 폴리 라인에 시작점이 [0,0]끝점 인 경우 [5,5]. 결과 : [1,1];[2,2];[3,3];[4,4];[5,5].

종료 지점을 포함하여 해당 줄의 모든 정수 지점을 찾고 싶습니다. 직선의 경우 이것은 간단하지 않지만 폴리 라인에 Beizer Curve, Circular Arc, Elliptic Arc 지오메트리 유형이있는 경우 어떻게해야합니까?

편집하다:

모든 라이센스 수준의 ArcGIS에서 사용할 수있는 도구 만 사용할 수 있습니다. 예를 들어 ArcGIS Basic입니다.


2
일반적으로 좋은 '정수'포인트를 얻지 못하는 경우가 많습니다. 그것은 당신의 모범에서 작동하지만 종종 실제 생활에서는 그렇지 않습니다. 일반적으로 정점의 위치 만 얻으므로 귀하의 경우 [0,0] 및 [5,5]를 얻게됩니다. '중간'포인트는 '가정'될 수 있습니다. 파이썬 에서이 작업을 수행하는 방법을 모르지만 몇 가지 도구를 사용하면 선에서 정점의 점 파일을 만들 수 있습니다.
Darren Cope

답변:


18

나는 이것이 오래되었다는 것을 알고 있지만 FeatureVerticesToPoints 도구에 ArcInfo가없는 것과 같은 것을 찾고 있었습니다 . 위의 검색 커서 솔루션을 사용한 후 코드를 단순화하기 위해 데이터 액세스 모듈에서 NumPy 배열을 사용하면 간단하고 매우 빠른 스크립트가 생성 될 수 있음을 발견했습니다. 이것을 스크립트 도구로 사용하고 있습니다.

참고 : 키가이다 explode_to_points의 매개 변수arcpy.da.FeatureClassToNumPyArray

ArcGIS Repository Location : Feature Class to Points에 대한 링크는 다음과 같습니다.

# Feature Class to Points
# 
# Paul Smith (2012) paul@neoncs.com.au

# Imports
import arcpy
import numpy

#Inputs from user parameters
InFc  = arcpy.GetParameterAsText(0) # input feature class
OutFc = arcpy.GetParameterAsText(1) # output feature class

# Spatial reference of input feature class
SR = arcpy.Describe(InFc).spatialReference

# Create NumPy array from input feature class
array = arcpy.da.FeatureClassToNumPyArray(InFc,["SHAPE@XY"], spatial_reference=SR, explode_to_points=True)

# Check array and Exit if no features found
if array.size == 0:
    arcpy.AddError(InFc + " has no features.")

# Create a new points feature class
else:
    arcpy.da.NumPyArrayToFeatureClass(array, OutFc, ['SHAPE@XY'], SR)

GIS.se Paul에 오신 것을 환영합니다 . 감사! 일부 편집 팁 : 텍스트, 인라인 또는 블록을 선택한 다음 ctrl-k코드 형식을 적용하십시오 ( b이전 및 italic 과 동일). 관습 적으로 우리는 "hi", "thanks", "cheers"와 같은 수다스러운 비트를 피하는 경향이 있습니다. 이들은 항상 존재하는 것으로 암시되며이 장소가 일반적인 포럼 및 이메일과 다른 아이디어를 강화하는 데 도움이됩니다. 탑승을 환영합니다.
matt wilkie 5

당신은 코드 배열의 줄에 WHERE_CLAUSE에 대한 자리 표시자를 넣어야 = arcpy.da.FeatureClassToNumPyArray (InFc, "", [ "SHAPE XY @", spatial_reference = SR, explode_to_points = 참)
앞으로 트리스탄

4

이해했듯이 폴리 라인 피처의 정점 수를 늘려야합니다. 또한 모든 "Beizer Curve, Circular Arc, Elliptic Arc"세그먼트를 여러 선 세그먼트로 변환합니다.

ArcGIS에서이 작업을 수행하려면 ArcToolbox에서 Densify (편집) 도구를 사용할 수 있습니다 .

그런 다음 제안 된 Darren Cope 및 artwork21에 따라 폴리 라인의 정점을 피쳐로 변환 할 수 있습니다 .

ArcMap에서 선호하는 경우 도움말 항목을 따라 새 점 만들기를 살펴보십시오 .


3

다음은 폴리 라인 및 폴리곤에서 작동해야합니다.

import arcpy

infc = r"D:\Projects\GDBs\slowbutter.gdb\fc"

desc = arcpy.Describe(infc)
shapefieldname = desc.ShapeFieldName

rows = arcpy.SearchCursor(infc)
for row in rows:
    # Create the geometry object
    feat = row.getValue(shapefieldname)
    print "Feature %i: " % row.getValue(desc.OIDFieldName)
    partnum = 0
    # Step through each part of the feature
    for part in feat:
        print "Part %i: " % partnum
        part_list = []
        for pnt in feat.getPart(partnum):
            if pnt:
                # Add to list
                part_list.append([pnt.X, pnt.Y])
            else:
                # If pnt is None, this represents an interior ring
                print "Interior Ring:"
        partnum += 1  
        print part_list

일부 영국 도로 데이터의 경우이 정보를 얻습니다. 폴리 라인을 구성하는 각 꼭짓점에 대한 중첩 된 X, Y 쌍 목록 :

Feature 7: 
Part 0: 
[[-0.48053999999996222, 51.482510000000048], [-0.48032999999992398, 
51.482609000000082], [-0.48026999999996178, 51.48273800000004], 
[-0.48043999999993048, 51.482891000000052], [-0.48065999999994347, 51.482948000000079],
[-0.48123999999995704, 51.483009000000038]]

ESRI 페이지에서 이것을 보았습니다. 그러나 설명을주의 깊게 살펴보면이 코드는 끝점 만 반환하고 끝점 만 반환합니다.
사용자

2
@crucifiedsoul-예, 이것은 ESRI 샘플 의 변형 이지만 끝점뿐만 아니라 모든 점의 X, Y 쌍을 제공합니다. 그것이 당신이 원하는 것입니다. 맞습니까?
채드 쿠퍼

나는 그것을 얻지 못한다. 유일한 것은 당신이 바꾸는 것 print pnt.X, pnt.Y입니다 part_list.append([pnt.X, pnt.Y]). 그리고 당신은 루프의 끝에 이것을 인쇄하고 있습니다. 코드가 어떻게 한 줄의 모든 포인트를 얻을 수 있지만 ESRI 코드는 그렇지 않습니까?
사용자

설명 방법이 효과가 없었습니다. 난 그냥 내 모양 필드 지정했다 - arcpy.da.SearchCursor (FC, [ "SHAPE을 @"])
jbalk

1

Darren Cope이 제안한 것처럼 피처 정점을 점으로 변환 도구 사용하여 레이어를 점 정점으로 변환 할 수 있습니다 .

다음은 파이썬 코드 스 니펫입니다.

# import system modules 
import arcpy
from arcpy import env

# Set environment settings
env.workspace = "C:/data"

# Set local variables
inFeatures = "majorrds.shp"
outFeatureClass = "c:/output/output.gdb/majorrds_midpt"

# Execute FeatureVerticesToPoints
arcpy.FeatureVerticesToPoints_management(inFeatures, outFeatureClass, "MID")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.