폴리 라인을 따라 거리가 주어진 끝점에서 폴리 라인의 점을 얻습니다.


10

폴리 라인의 시작점과 끝 점이 있습니다. 주어진 거리로 지정된 끝점에서 해당 폴리선의 점을 얻는 방법은 무엇입니까?

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

어떻게이 스크립트 (모든 모듈을 가져 오지 않고 ArcView에서 작업을해야한다는 제공 arcpy 사용하여이 작업을 얻을 수있는 이 답변처럼을 ). 값을 하드 코딩하지 않으려 고합니다.

관련 질문 :


object.interpolate (distance [, normalized = False])를 사용하여 결과를 얻지 못했습니까?
vinayan

1
당신은 어디서 않았다 object.interpolate(distance[, normalized=False]). 아크 피의 방법입니까? 그렇다면 링크를 게시하십시오. 나는 그것을 봤지만 찾지 못했습니다.
사용자

그것은 매끈한 방법입니다. toblerity.github.com/shapely/… 다른 질문에서 시도 했다고 생각합니다. 결과가 있는지 확실하지 않습니다.
vinayan

2
또 다른 관련 질문은 gis.stackexchange.com/questions/6476/… 이며, 이는이 문제의 반대에 관한 것입니다 (점에 주어진 거리를 찾으십시오). 두 가지 솔루션은 밀접한 관련이 있습니다. 일단 폴리 라인을 측정 할 수있게되면 폴리 라인을 따라 모든 점을 거리로 표시 할 수 있습니다 (그리고 임의의 세그먼트는 거리 범위로 처리 할 수 ​​있음).
whuber

답변:


7

이것은 "선형 참조"와 비슷하게 들리며 해당 도구 세트는 ArcView에서 사용할 수 있습니다. 또한이 도구를 매우 쉽게 스크립팅 할 수 있습니다.

선형 참조를위한 ESRI 도움말 링크


1
+1 이것은이 문제에 대해 명시 적으로 생성 된 성숙한 기능을 사용한다는 점에서 "올바른"접근 방식입니다.
whuber

6

@LouisH가 언급했듯이 귀하의 요구에 따라 Linear Referencing을 사용하는 것이 확실합니다. 하드 코딩 요소가 아니라 매개 변수로 요청 해야하는 일부 코드를 함께 모았습니다.

설명에 따라, 아래에 사용 된 선형 참조 도구는 사용자의 경우 "경로"를 취하고 거리 필드를 기준으로 점을 따라 "이벤트"를 표시합니다. 이로 인해 FeatureLayer가 메모리에 저장됩니다. 이는 기능을 출력 기능 클래스에 복사하는 마지막 함수의 이유입니다.

import arcpy
import os
from arcpy import env

#Working directory
wkspace        = arcpy.GetParameterAsText(0)
#Line feature class
rtecls         = arcpy.GetParameterAsText(1)
#Line Unique ID
rtecls_ID      = arcpy.GetParameterAsText(2)
#Table of points to be located
pnttbl         = arcpy.GetParameterAsText(3)
#Field in point table that references line point will be located along
pttbl_rteid    = arcpy.GetParameterAsText(4)
#Distance field in point table
pttbl_dst      = arcpy.GetParameterAsText(5)
#Output Layer, layer is stored in memory.  Features still need to be copied to feature class saved to disk
outlayer       = arcpy.GetParameterAsText(6)
#Output Feature Class - If shapefile, make sure to include ".shp" at the end.
outclass       = arcpy.GetParameterAsText(7)

#Type of feature being located
fttype = "POINT"

#Set Workspace
env.workspace = wkspace

#Build String for input parameters in Linear Referencing tool
pt_props = pttbl_rteid + " " + fttype + " " + pttbl_dst

#Output featureclass path
outfclass = wkspace + os.sep + outclass

# Execute MakeRouteEventLayer
arcpy.MakeRouteEventLayer_lr (rtecls, rtecls_ID, pnttbl, pt_props, outlayer)

#Save feature layer to feature class on disk
arcpy.CopyFeatures_management(outlayer, outfclass)

편집-이 도구로 고려해야 할 한 가지 사항은 선의 끝에서 거리를 기준으로 점을 찾는 작업은 시작할 선의 끝입니다. 예를 들어 선형 참조 도구는 디지털화 된 라인 방향을 기준으로 작동합니다. 측정 기준이되는 엔드 포인트를 식별 할 수있는 방법이 있는지 확인하는 것이 중요합니다.


5

이와 같은 선형 참조 문제를 해결하는 without importing any modules것은 내 범위를 벗어납니다.

나는 Shapely(2D 지리 공간 기하학의 조작과 분석을 위해 파이썬 패키지를 사용했다 . 그리고 그것은 BSD 라이센스이다 :-))

여기 에서 다운로드 하십시오 . arcgis 10 arcpy를 지원하는 유일한 버전 2.6 .. 간단한 설치 (1.5MB 크기)

그리고 이제 여기에 목적을 달성하는 arcpy 스크립트가 있습니다 .. python을 용서하십시오. 오늘만 루프, 튜플 등에 대해 배웠습니다. :)

import arcpy
import math
from arcpy import env

env.workspace = r"C:\testshape"

desc = arcpy.Describe("Rivers.shp")
shapefieldname = desc.ShapeFieldName

rows = arcpy.SearchCursor("Rivers.shp")

temptup = ()

# get ESRI geometries out of their cage..
for row in rows:

    feat = row.getValue(shapefieldname)
    partnum = 0
    for part in feat:
        for pnt in feat.getPart(partnum):
            if pnt:
                temptup += ((pnt.X, pnt.Y),)
            else:
                print "Interior Ring:"
        partnum += 1    

# and now the shapely magic :)

import shapely
from shapely.geometry import LineString
lnstr = LineString(temptup)
rsltPoint = lnstr.interpolate(0.5)
print(rsltPoint.x,rsltPoint.y)

참고 : 지형지 물에 곡선 세그먼트가있는 경우 작동하지 않습니다


2

나는이 질문이 내가 생각하는 것과 똑같은 일을하려고한다는 것을 알았습니다. 나는 모든 것을 arcpy를 통해 끝내기를 원했습니다. 포인트 이벤트가 없기 때문에 선형 참조를 사용하는 것이 의미가 없었습니다 (LR을 사용하여 가져 오는 방법을 알 수 없었습니다). 내가 사용한 결과의 핵심은

    line = arcpy.Polyline(arrayPts)
    pt = line.positionAlongLine (0.99, 'True')

이를 위해서는 Arc 10.1 이상이 필요합니다. 이것이 내가 보유한 ArcInfo 라이센스 수준 (OP 지정 ArcView) 이하에서 사용 가능한지 여부를 파악할 수 없었습니다.

위의 예에서 고정 거리가 아닌 전체 선 길이의 백분율로 포인트를 원했습니다. 이를 위해 두 번째 선택적 인수를에 제공했습니다 positionAlongLine. 절대 거리 만 지정하려면 두 번째 인수를 건너 뜁니다. doc이 있습니다.

풀러 코드 샘플은

import numpy
ptsList = list()
id = 0

with arcpy.da.SearchCursor('flFL', ["SHAPE@"]) as cursor:
    for row in cursor: 
        arrayPts = row[0].getPart()
        line = arcpy.Polyline(arrayPts)
        pt = line.positionAlongLine (0.99, 'True')
        ptsList.append((id, (pt.getPart().X, pt.getPart().Y)))
        id += 1

array = numpy.array([ptsList], \
numpy.dtype([('idfield',numpy.int32),('XY', '<f8', 2)]))

SR = arcpy.Describe("flFL").spatialReference
arcpy.da.NumPyArrayToFeatureClass(array, 'nsegSamplePts', ['XY'], SR)

'flFL'포인트를 찾을 선의 특징 레이어입니다. 꽤 빠르게 실행됩니다. NumPyArrayToFeatureClass내 모든 포인트를 featureClass로 되돌릴 수있는 아주 좋은 방법이었습니다 (동료 커티스에게 감사드립니다!). w / 실험하고 Append_management있었지만 그것은 조금 느립니다.


+1 공유해 주셔서 감사합니다. 측정 된 폴리 라인을 설정하는 데 투자하지 않으려는 경우 일회성 솔루션처럼 보입니다. 이 솔루션은 좌표가 저장된 순서에 따라 결정된 폴리 라인의 암시 적 방향을 사용합니다. 주의를 기울이지 않으면 잘못된 끝에서 시작하여 계산 된 포인트로 감길 수 있습니다. 따라서이 솔루션을 향상시켜 사용자가 (어쩌면) 한쪽 끝 근처에 점을 입력하여 폴리 라인의 시작 부분을 지정할 수 있도록하는 것이 좋습니다.
whuber

1
확실히 맞습니다. 나는 하류로 향하는 배수 네트워크의 라인을 사용하고 있기 때문에 이것을 처리 할 필요가 없었습니다. 선 방향이 의도적이지 않으면 위에서 제안한대로 사전 프로세스로 배열 될 수 있습니다. 오리엔테이션이 의도적이라면, 복사하고 방향을 바꾸고 레시피를 사용할 수 있습니다. 방향이 현재 해석에 도움이되지 않더라도 점은 여전히 ​​원래 선 피쳐 클래스에 올바르게 정렬됩니다.
Roland

1

과잉 일 수 있지만 Network Analysis 확장에 액세스 할 수 있으면 폴리 라인에서 네트워크를 생성 한 다음 입력 지점 주변에 서비스 영역생성 하여 관심 거리로 SA 크기를 지정할 수 있습니다. 다음은 지점에서 111m SA의 간단한 예입니다.

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

그런 다음 SA가 선을 교차하는 지점을 찾아야합니다.


-1

Feature Vertices To Points (Data Management) 방법으로 얻을 수 있다고 생각합니다. 당신은 여기에 더 많은 정보를 얻을 수 있습니다 .

또는 지점에서 분할 선 (데이터 관리)을 여기서 확인할 수 있습니다 .

그것들은 충분히 충분하지 않지만 자신의 코드를 작성할 수 있습니다 ...

나는 그것이 당신에게 도움이되기를 바랍니다 ...


2
이러한 옵션의 문제점은 선을 분할하거나 분할하기 전에 선에 꼭지점을 추가하기 위해 점 위치에 대한 사전 지식이 필요하다는 것입니다. 그 지점 위치는 위의 질문에서 알려지지 않은 것이므로 이러한 솔루션 중 하나를 적용하기가 어렵습니다.
공간을 얻으십시오
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.