포인트 피처에서 정사각형 버퍼를 만들고 싶지만 그것에 들어가는 코드를 이해하지 못합니다.
forums.esri 웹 사이트에서 비슷한 질문이 있었지만 10 년 전이었고 코드를 시도해도 작동하지 않았습니다.
포인트 피처에서 정사각형 버퍼를 만들려면 어떻게합니까?
포인트 피처에서 정사각형 버퍼를 만들고 싶지만 그것에 들어가는 코드를 이해하지 못합니다.
forums.esri 웹 사이트에서 비슷한 질문이 있었지만 10 년 전이었고 코드를 시도해도 작동하지 않았습니다.
포인트 피처에서 정사각형 버퍼를 만들려면 어떻게합니까?
답변:
ArcMap 10으로 다음 단계를 시도하십시오.
파이썬 솔루션의 경우 :
가능한 해결책은 원하는 반지름으로 표준 ESRI 버퍼 도구를 사용하여 "일반"라운드 버퍼를 생성 한 다음 해당 피쳐 클래스의 버퍼에서 피쳐 봉투를 다각형으로 수행하는 것입니다. 그러면 각 피처의 범위 주위에 정사각형 엔벌 로프 피처가 생성됩니다. Feature Envelope to Polygon은 데이터 관리> 기능에 있습니다. 모델 빌더 모델은 다음과 유사합니다.
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)
ArcObjects를 사용한다고 가정하고 (사용중인 언어 및 API를 지정하려면 태그를 사용하십시오) IEnvelope.Expand
다음 예제와 같이 포인트의 봉투에서 정사각형 버퍼를 만드는 데 사용할 수 있습니다. GeoFeatureLayer 스 니펫의 포인트 검색에서 모든 기능 가져 오기
ESRI.ArcGIS.Geometry.IEnvelope envelope = point.Envelope;
envelope.Expand(searchTolerance, searchTolerance, false);
Aaron의 답변에 대한 대안으로 Advanced 라이센스가없는 경우 Minimum Bounding Geometry 도구를 사용하십시오 . 아래 단계 (Aaron에서 수정) :
편집 :이 옵션을 사용하면 'ENVELOPE'옵션 (고급 라이센스가 필요함)을 사용하지 않고 결과 사각형 버퍼의 방향을 제어 할 수 없습니다. '출력에 속성으로 형상 특성 추가 (옵션)'옵션을 선택하면 결과 오프셋이 출력 피쳐 클래스에서 'MBG_Orientation'으로 기록됩니다. 그런 다음 원하는 경우 피쳐를 중심으로 다시 회전시키는 데 사용할 수 있습니다. ArcPy를 사용하여 속성 테이블에서 값으로 다각형 회전을 참조하십시오 . 그것에 대한 잠재적 인 해결책을 위해.
이 사이트 는 geographiclib JavaScript 및 js2shapefile을 사용하여 csv를 정사각형 또는 사각형 또는 원형 버퍼로 변환하는 방법을 설명합니다.
문제가 해결되면 살펴볼 수 있습니다.