ArcGIS Desktop을 사용하여 다각형 (웰 패스) 내에 평행선을 그리시겠습니까?


11

여러 개의 불규칙 다각형이있는 다각형 피쳐 클래스를 사용하고 각 다각형 내부에 호를 평행선으로 그립니다. 이상적으로 Arc가 다각형의 가장 긴면의 각도를 파악하고 그면에 평행선을 그리는 것이 좋을 것입니다. 그러나 간단하게 유지하려면 모든 평행선에 대해 하나의 각도 만 입력하면된다고 생각합니다. 더 쉬울 것입니다.

따라서 선의 각도, 선 사이의 너비, 최소 / 최대 길이 및 다각형 측면의 버퍼 너비가 기본 기준입니다.

도움이된다면 이미지가 첨부되었습니다.

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


선이 다각형 가장자리에서 일정 거리를 벗어나야합니까?
cndnflyr

예, 가장자리에서 버퍼를 멀리 가져와야합니다. 그 가치를 선언 할 수 있다면 좋을 것입니다. 감사.
Tx_Dan

답변:


9

@cndnflyr가 언급했듯이 이것은 Python으로 스크립팅 할 수 있습니다.

스크립트 도구 UI :

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

샘플 출력 : 여기에 이미지 설명을 입력하십시오

# import libraries
import arcpy

# set input/output parameters
polyFC = arcpy.GetParameterAsText(0)        # input polygons
outParallel = arcpy.GetParameterAsText(1)   # output parallel lines
lineSpacing = arcpy.GetParameterAsText(2)   # line spacing
buffDist = arcpy.GetParameterAsText(3)      # inner buffer distance

# parse numbers from parameters
lineSpaceNum = float(lineSpacing.split(' ')[0])
buffNum = float(buffDist.split(' ')[0])

# establish spatial reference
desc = arcpy.Describe(polyFC)
SR = desc.spatialReference

# set overwrite environment
arcpy.env.overwriteOutput = True
arcpy.env.outputCoordinateSystem = SR

parallels = []
# loop through each input shape
for row in arcpy.da.SearchCursor(polyFC, ["SHAPE@"], spatial_reference=SR):

    # create inner buffer
    polyBuff = row[0].buffer(buffNum * -1)

    # create hull rectangle to establish a rotated area of interest
    coordSplit = row[0].hullRectangle.split(' ')

    # collect corner coordinates
    coordList = arcpy.Array([arcpy.Point(coordSplit[0],coordSplit[1]),arcpy.Point(coordSplit[2],coordSplit[3]),arcpy.Point(coordSplit[4],coordSplit[5]),arcpy.Point(coordSplit[6],coordSplit[7]),arcpy.Point(coordSplit[0],coordSplit[1])])

    # create lines from hull rectangle
    currentLines = []
    for pointNum in range(0,4):
        arcpy.Array([coordList.getObject(pointNum),coordList.getObject(pointNum+1)])
        hullRecLine = arcpy.Polyline(arcpy.Array([coordList.getObject(pointNum),coordList.getObject(pointNum+1)]))
        currentLines.append(hullRecLine)

    # compare first and second line to determine if first line is short or long
    firstLong = 0
    if currentLines[0].length > currentLines[1].length:
        firstLong = 1

    # calculate number of points needed along short axis
    numPoints = int(math.floor(currentLines[firstLong].length/lineSpaceNum))

    # create and join points to create parallel lines
    for point in range(1,numPoints+1):
        shortPoint1 = currentLines[firstLong].positionAlongLine(lineSpaceNum*point)
        shortPoint2 = currentLines[firstLong + 2].positionAlongLine(currentLines[firstLong + 2].length - (lineSpaceNum*point))
        parallel = arcpy.Polyline(arcpy.Array([shortPoint1.centroid,shortPoint2.centroid]), SR)

        # intersect parallel lines with buffer
        parallelBuff = parallel.intersect(polyBuff,2)
        parallels.append(parallelBuff)

# write geometries to disk
arcpy.CopyFeatures_management(parallels, outParallel)

# add to map
mxd = arcpy.mapping.MapDocument("CURRENT")
dataFrame = arcpy.mapping.ListDataFrames(mxd, "*")[0]
addLayer = arcpy.mapping.Layer(outParallel)
arcpy.mapping.AddLayer(dataFrame, addLayer)

del row

와우,이 아름다운! 살펴볼 것입니다. 정말 고맙습니다!
Tx_Dan

이것은 SHAPE 객체의 메소드를 많이 사용합니다. 우아합니다. 그것이 누락 된 유일한 것은 선의 각도를 설정하는 것입니다. 있는 그대로 다각형의 가장 긴면을 따라 선을 그립니다.
cndnflyr

4

이것은 파이썬으로 할 수 있지만 그것을 작성하는 데 약간의 시간이 걸릴 것입니다.

파이썬없이 구현하는 가장 빠른 방법은 이러한 평행선의 템플릿 SHP 파일을 갖는 것입니다. 필요한 너비가 다양한 경우 몇 가지를 가지고 해당 다각형에 적절한 너비를 사용하십시오. 템플릿 선이 가장 큰 다각형을 덮을 수있는 충분한 영역을 포함하도록합니다.

  1. 편집하는 동안 선을 다각형 위로 이동하십시오.
  2. 회전 도구를 사용하여 기준점을 평행선과 다각형 모서리가 일치하는 위치로 이동 한 다음 선을 회전시켜 정렬 한 다각형 모서리에 맞 춥니 다.
  3. 다각형을 폴리 라인으로 변환
  4. 평행선이 다각형 가장자리에서 원하는 거리만큼 폴리 라인을 버퍼링합니다.
  5. 지우기 도구를 사용하여 버퍼링 된 다각형 가장자리로 덮인 폴리 라인을 지 웁니다.
  6. 다각형 안에없는 모든 선을 위치별로 선택하고 삭제합니다. 또는 클립 도구도 작동한다고 생각합니다.
  7. 특정 길이 (필드를 추가하고 지오메트리를 먼저 계산해야 할 수도 있지만 유지하기에는 너무 짧음)와 특정 길이 (길이가 너무 길면 너무 길다) 인 모든 선을 속성별로 선택하십시오. ) 삭제하십시오.
  8. 헹굼과 반복 ...

코드를 작성할 필요없이 3 단계부터 7 단계까지 모델링 할 수 있습니다.

프로세스를 코딩하는 데 동일한 프로세스를 사용할 수는 있지만 템플릿 라인을 사용하는 대신 코드를 사용하여 직각, 거리 등으로 라인을 그릴 수 있습니다. 잠시 동안이 작업을 수행하지 않았지만 매끈한 파이썬 라이브러리 가 도움이 될 것입니다. 폴리곤보다 넓은 영역을 커버하는지 확인하고 도구를 사용하여 폴리 라인으로 자동 변환, 버퍼링, 지우기, 폴리곤 내부가 아닌 선을 선택하여 삭제하십시오.


자세한 답변 주셔서 감사합니다. 나는 이것을 시도하고 그것이 어떻게 작동하는지 볼 것이다. 감사!
Tx_Dan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.