ArcGIS for Desktop을 사용하여 포인트 피처 주위의 사각형 버퍼를 생성합니까?


31

포인트 피처에서 정사각형 버퍼를 만들고 싶지만 그것에 들어가는 코드를 이해하지 못합니다.

forums.esri 웹 사이트에서 비슷한 질문이 있었지만 10 년 전이었고 코드를 시도해도 작동하지 않았습니다.

포인트 피처에서 정사각형 버퍼를 만들려면 어떻게합니까?


gis.stackexchange.com/questions/12479/… 본질적으로 복제본입니다 (이 질문의 일반화를 해결하기 때문에) 여기에 이미 정사각형 버퍼에 대한 좋은 답변이 있으므로 스레드를 열어 두는 것이 가장 좋습니다. 병합하지 않고 분리하십시오. 그러나 더 많은 솔루션을 원한다면 다른 스레드도 읽으십시오!
— whuber

2
고마워 whuber. 방금 어제이 웹 사이트를 찾았는데 여전히 잘 알고 있습니다. 나는 내 미래의 게시물 / 질문으로 그렇게하려고 노력할 것입니다. 이 사이트를 ArcGIS 포럼보다 훨씬 좋아합니다.
— Kimball

킴볼 (Kimball)은 어떤 식 으로든 비평이라고 비난하지 않았습니다. 두 개의 스레드가 합쳐지지 않도록하는 것이 전부였습니다. 우리 커뮤니티에 오신 것을 환영합니다! (그리고 ArcGIS 포럼에있는 사람들에 대해 친구에게 알려주십시오. :-)
— whuber

권리. 나는 당신이 그런 식으로 의미하지 않았다는 것을 알고 있습니다. 나는이 커뮤니티를 많이 즐기고 이미 다른 사람들에게이 새로운 포럼에 대해 이야기하기 시작했습니다.
— Kimball

당신의 중요한 공유에 감사드립니다. 포인트 기능의 필드 데이터 세트를 사용하여 좌표를 수동으로 입력하지 않고 제공하는 스크립트를 사용하여 사각형 버퍼를 만드는 방법을 궁금합니다. 감사합니다

답변:


47

ArcMap 10으로 다음 단계를 시도하십시오.

  1. 포인트 기능을 버퍼링 합니다 (ArcToolbox> 분석 도구> 근접성> 버퍼). 선형 단위 상자에서 올바른 거리를 선택하십시오.
  2. 새로 작성된 버퍼를 Feature Envelope to Polygon 도구 (데이터 관리 도구> 기능> Feature Envelope to Polygon)에 입력하십시오. 포인트가 여러 개인 경우 "멀티 파트 피쳐 생성"상자를 선택하십시오.

파이썬 솔루션의 경우 :

SearchCursor 및 InsertCursor를 사용하여 정사각형 버퍼 만들기

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


2
+1 해결 방법이 가장 효과적이라는 답변입니다.
— whuber

12

가능한 해결책은 원하는 반지름으로 표준 ESRI 버퍼 도구를 사용하여 "일반"라운드 버퍼를 생성 한 다음 해당 피쳐 클래스의 버퍼에서 피쳐 봉투를 다각형으로 수행하는 것입니다. 그러면 각 피처의 범위 주위에 정사각형 엔벌 로프 피처가 생성됩니다. Feature Envelope to Polygon은 데이터 관리> 기능에 있습니다. 모델 빌더 모델은 다음과 유사합니다.

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


훌륭한 솔루션! 또한 버퍼 출력을 in_memory 레이어 (in_memory \ tmpBuffer)로 작성하면 불필요한 데이터를 디스크에 쓰지 않고 프로세스를 훨씬 빠르게 수행 할 수 있습니다.
— RyanDalton

9

Aaron의 코드 끝에 링크 된 스크립트는 정사각형 버퍼에만 사용할 수 있고 최신 arcpy.da 모듈을 사용하지 않기 때문에 사각형 버퍼를 만드는 데 사용할 수있는 스크립트를 작성했습니다. 10k 랜덤 포인트 데이터 세트에서 10 초 안에 완료되었습니다.

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

import os, arcpy

point_FC = arcpy.GetParameterAsText(0)
w = float(arcpy.GetParameterAsText(1))
h = float(arcpy.GetParameterAsText(2))
output_FC = arcpy.GetParameterAsText(3)

def rect(coord, w, h):
        #Given XY coordinates and rectangle dimensions,
        #return a polygon object of a rectangle centered about the point
        x,y = coord
        w *= 0.5
        h *= 0.5
        xmin,xmax = x-w, x+w
        ymin,ymax = y-h, y+h
        poly = ((xmin, ymax), (xmax, ymax), (xmax, ymin), (xmin, ymin))
        return arcpy.Polygon(arcpy.Array(arcpy.Point(*p) for p in poly))

#Create output feature class.
spatref = arcpy.Describe(point_FC).spatialReference
folder, base = os.path.split(output_FC)
arcpy.CreateFeatureclass_management(folder, base, "POLYGON", spatial_reference=spatref)

#Get field object for every field in input except OID and Shape.
fields = [f for f in arcpy.ListFields(point_FC) if f.type not in ("OID", "Geometry")]

for field in fields:
         arcpy.AddField_management(output_FC, field.name, field.type, field.precision,
                                   field.scale, field.length, field.aliasName,
                                   field.isNullable, field.required, field.domain)

#Get field names to be inputted to cursors.
#Need SHAPE@XY token to read point coords and SHAPE@ token to write polygon coords.
fnames = [f.name for f in fields]
fields_in = fnames[::]
fields_out = fnames[::]
fields_in.append("SHAPE@XY")
fields_out.append("SHAPE@")

#Create buffers and write attributes to output FC, if any.
count = int(arcpy.GetCount_management(point_FC)[0])
arcpy.SetProgressor("step", "Buffering...", 0, count, 1)
with arcpy.da.SearchCursor(point_FC, fields_in) as Scursor,  arcpy.da.InsertCursor(output_FC, fields_out) as Icursor:
        for i,row_in in enumerate(Scursor):                
                #"Convert" point to rectangle
                arcpy.SetProgressorPosition(i)
                feature = list(row_in)
                feature[-1] = rect(feature[-1], w, h)                
                Icursor.insertRow(feature)


1

Aaron의 답변에 대한 대안으로 Advanced 라이센스가없는 경우 Minimum Bounding Geometry 도구를 사용하십시오 . 아래 단계 (Aaron에서 수정) :

  1. 포인트 기능을 버퍼링 합니다 (ArcToolbox> 분석 도구> 근접성> 버퍼). 선형 단위 상자에서 올바른 거리를 선택하십시오.
  2. 새로 작성된 버퍼를 최소 경계 형상 도구 (데이터 관리 도구> 기능> 최소 경계 형상)에 입력하십시오. 'RECTANGLE_BY_AREA'또는 'RECTANGLE_BY_WIDTH'를 사용하십시오. 다른 옵션은 고급 라이센스에서만 사용할 수 있습니다.

편집 :이 옵션을 사용하면 'ENVELOPE'옵션 (고급 라이센스가 필요함)을 사용하지 않고 결과 사각형 버퍼의 방향을 제어 할 수 없습니다. '출력에 속성으로 형상 특성 추가 (옵션)'옵션을 선택하면 결과 오프셋이 출력 피쳐 클래스에서 'MBG_Orientation'으로 기록됩니다. 그런 다음 원하는 경우 피쳐를 중심으로 다시 회전시키는 데 사용할 수 있습니다. ArcPy를 사용하여 속성 테이블에서 값으로 다각형 회전을 참조하십시오 . 그것에 대한 잠재적 인 해결책을 위해.

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


특정 피쳐 클래스의 경우이 워크 플로우를 사용하여 사각형을 다른 방향으로 회전시킵니다. 아마도 버퍼 원이 겹치기 때문일 수 있습니다. 확실하지 않다. Esri가 동일한 피쳐 클래스에서 위에서 Aaron의 메소드를 사용하도록하고 버퍼링 된 원을 회전시키지 않았습니다.
— 앤드류

@Andrew, 맞습니다. 고급 라이센스가없는 도구의 한계입니다. ENVELOPE 옵션을 사용하면 위의 Aaron 방법과 동일한 결과가 반환되지만 고급 라이센스가 필요합니다. 가능한 해결 방법은 '지오메트리 특성을 속성으로 추가'옵션을 선택하고 기울어 진 양을 확인한 다음 (일관 적이어야 함) 편집 세션에서 결과 사각형 버퍼를 해당 양만큼 회전시키는 것입니다. 아직 시도하지 않았습니다.
— 던 Caan

0

이 사이트 는 geographiclib JavaScript 및 js2shapefile을 사용하여 csv를 정사각형 또는 사각형 또는 원형 버퍼로 변환하는 방법을 설명합니다.

문제가 해결되면 살펴볼 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.