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.