Tạo bộ đệm vuông xung quanh tính năng điểm bằng ArcGIS cho Máy tính để bàn?


31

Tôi muốn tạo một bộ đệm vuông từ một tính năng điểm nhưng tôi không hiểu mã đi vào nó.

Các câu hỏi tương tự đã được hỏi trên trang web forum.esri nhưng đã hơn 10 năm trước và nó không hoạt động khi tôi thử mã.

Làm cách nào để tạo bộ đệm vuông từ tính năng điểm?


gis.stackexchange.com/questions/12479/... về cơ bản là một bản sao (vì nó đề cập đến một sự tổng quát của câu hỏi này), nhưng khi có những câu trả lời đã tốt ở đây cụ thể cho các bộ đệm vuông, có vẻ như tốt nhất để lại cả chủ đề mở và riêng biệt hơn là hợp nhất chúng. Nhưng nếu bạn muốn có nhiều giải pháp hơn, hãy đọc các chủ đề khác quá!
whuber

2
OK cảm ơn ai. Tôi mới tìm thấy trang web này ngày hôm qua và tôi vẫn đang làm quen với nó. Tôi sẽ cố gắng làm điều đó với các bài viết / câu hỏi trong tương lai của tôi. Tôi thích trang web này tốt hơn nhiều so với các diễn đàn ArcGIS.
Kimball

Tôi không có ý nhận xét đó là lời chỉ trích theo bất kỳ cách nào, Kimball: đó là ở đó để ngăn chặn việc hợp nhất hai chủ đề, đó là tất cả. Chào mừng đến với cộng đồng của chúng tôi! (Và hãy nói với bạn bè của bạn về chúng tôi, đặc biệt là những người trên diễn đàn ArcGIS. :-)
whuber

Đúng. Tôi biết bạn không có ý đó. Tôi thích cộng đồng này rất nhiều và đã bắt đầu nói với những người khác về diễn đàn mới này.
Kimball

Cảm ơn bạn đã chia sẻ quan trọng của bạn. Tôi tự hỏi làm thế nào tôi có thể sử dụng một tập hợp dữ liệu trường trong tính năng điểm để tạo bộ đệm hình chữ nhật bằng cách sử dụng tập lệnh mà bạn cung cấp mà không cần nhập thủ công tọa độ của chúng. Cảm ơn

Câu trả lời:


47

Hãy thử các bước sau với ArcMap 10:

  1. Bộ đệm tính năng điểm của bạn (ArcToolbox> Công cụ phân tích> Khoảng cách> Bộ đệm). Đảm bảo chọn khoảng cách chính xác trong hộp Đơn vị tuyến tính.
  2. Nhập bộ đệm mới tạo của bạn vào công cụ Phong bì tính năng cho Đa giác (Công cụ quản lý dữ liệu> Tính năng> Phong bì tính năng cho Đa giác). Đảm bảo chọn hộp "Tạo nhiều tính năng" nếu bạn có nhiều điểm.

Đối với giải pháp Python:

Sử dụng SearchCthon và insertCthon để tạo bộ đệm vuông

nhập mô tả hình ảnh ở đây


2
+1 Trả lời chứng minh giải pháp hoạt động là tốt nhất.
whuber

12

Một giải pháp khả thi sẽ là tạo bộ đệm tròn "bình thường" của bạn bằng cách sử dụng công cụ bộ đệm ESRI tiêu chuẩn với bất kỳ bán kính nào bạn muốn và sau đó thực hiện một Envel Feature to Polygon trên lớp bộ đệm tính năng kết quả đó. Điều này tạo ra một tính năng phong bì vuông xung quanh phạm vi của từng tính năng. Tính năng phong bì cho đa giác nằm trong Quản lý dữ liệu> Tính năng. Mô hình xây dựng mô hình sẽ trông tương tự như:

nhập mô tả hình ảnh ở đây


Giải pháp tuyệt vời! Ngoài ra, bằng cách tạo đầu ra của bộ đệm dưới dạng lớp in_memory (in_memory \ tmpBuffer) và bạn có thể tránh ghi dữ liệu không cần thiết vào đĩa và làm cho quá trình nhanh hơn nhiều.
RyanDalton

9

Vì tập lệnh được liên kết ở cuối mã Aaron chỉ có thể được sử dụng cho bộ đệm vuông và không sử dụng mô-đun arcpy.da mới hơn, tôi đã viết một tập lệnh có thể được sử dụng để tạo bộ đệm hình chữ nhật. Trên bộ dữ liệu điểm ngẫu nhiên 10k, nó hoàn thành sau 10 giây:

nhập mô tả hình ảnh ở đây

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)

5

Giả sử bạn đang sử dụng ArcObjects (vui lòng sử dụng các thẻ để chỉ định ngôn ngữ và API bạn đang sử dụng), bạn có thể sử dụng IEnvelope.Expandđể tạo bộ đệm vuông từ đường bao của một điểm, như trong ví dụ này: Nhận tất cả các tính năng từ Tìm kiếm điểm trong GeoFeatureLayer Snippet

ESRI.ArcGIS.Geometry.IEnvelope envelope = point.Envelope;
envelope.Expand(searchTolerance, searchTolerance, false);

1

Thay thế cho câu trả lời của Aaron, đối với những người không có giấy phép Nâng cao, hãy sử dụng công cụ Hình học giới hạn tối thiểu . Các bước dưới đây (sửa đổi từ Aaron):

  1. Bộ đệm tính năng điểm của bạn (ArcToolbox> Công cụ phân tích> Khoảng cách> Bộ đệm). Đảm bảo chọn khoảng cách chính xác trong hộp Đơn vị tuyến tính.
  2. Nhập bộ đệm mới tạo của bạn vào công cụ Hình học giới hạn tối thiểu (Công cụ quản lý dữ liệu> Tính năng> Hình học giới hạn tối thiểu). Sử dụng 'RECTANGLE_BY_AREA' hoặc 'RECTANGLE_BY_WIDTH', các tùy chọn khác chỉ khả dụng với giấy phép Nâng cao.

EDIT : Tùy chọn này không cho phép bạn kiểm soát hướng của bộ đệm vuông kết quả, mà không sử dụng tùy chọn 'ENVELOPE' (yêu cầu giấy phép Nâng cao). Bằng cách đánh dấu tùy chọn 'Thêm đặc điểm hình học làm thuộc tính cho đầu ra (tùy chọn)' - phần bù kết quả sẽ được ghi là 'MBG_Orientation' trong lớp tính năng đầu ra. Điều này sau đó có thể được sử dụng để xoay các tính năng trở về trung tâm nếu muốn - xem Xoay đa giác theo giá trị từ bảng thuộc tính bằng ArcPy? cho một giải pháp tiềm năng cho điều đó.

nhập mô tả hình ảnh ở đây


Đối với lớp tính năng cụ thể của tôi, nó kết thúc việc xoay các hình vuông theo các hướng khác nhau bằng cách sử dụng quy trình công việc này. Có lẽ bởi vì tôi có vòng tròn đệm chồng chéo. Không chắc. Tôi đã cho Esri sử dụng phương pháp của Aaron ở trên trên cùng một lớp đối tượng và nó không xoay vòng tròn được đệm.
Andrew

@Andrew, vâng, bạn đúng, đó là một hạn chế của công cụ mà không có Giấy phép nâng cao. Sử dụng tùy chọn ENVELOPE sẽ trả về kết quả giống như phương pháp của Aaron ở trên, nhưng cũng cần Giấy phép nâng cao. Một cách giải quyết tiềm năng sẽ là đánh dấu vào tùy chọn 'thêm đặc điểm hình học làm thuộc tính', tìm ra số lượng chúng bị nghiêng (nên nhất quán), sau đó xoay bộ đệm vuông kết quả theo số tiền đó trong phiên chỉnh sửa. Chưa thử cái này.
Dùn Caan

0

Trang web này mô tả cách chuyển đổi bộ đệm csv sang hình vuông hoặc hình chữ nhật hoặc hình tròn bằng cách sử dụng JavaScript địa lý và js2shapefile.

Bạn có thể có một cái nhìn nếu nó giải quyết vấn đề của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.