Создание квадратного буфера вокруг точечного объекта с использованием ArcGIS for Desktop?


31

Я хотел бы создать квадратный буфер из точечного объекта, но я не понимаю код, который входит в него.

Подобные вопросы были заданы на веб-сайте forums.esri, но это было более 10 лет назад, и когда я попробовал код, это не сработало

Как создать квадратный буфер из точечного объекта?


gis.stackexchange.com/questions/12479/… по сути является дубликатом (поскольку он касается обобщения этого вопроса), но, поскольку здесь уже есть хорошие ответы, относящиеся к квадратным буферам, кажется, что лучше оставить оба потока открытыми и отделить, а не объединить их. Но если вы хотите еще больше решений, прочитайте и другую ветку!
whuber

2
ОК, спасибо. Я только вчера нашел этот сайт, и я все еще знакомлюсь с ним. Я постараюсь сделать это с моими будущими сообщениями / вопросами. Мне нравится этот сайт намного лучше, чем форумы ArcGIS.
Кимбалл

Я не имел в виду этот комментарий как критику, Кимбалл: он был там, чтобы предотвратить слияние двух потоков, вот и все. Добро пожаловать в наше сообщество! (И, пожалуйста, расскажите о нас своим друзьям, особенно на форумах ArcGIS. :-)
whuber

Правильно. Я знаю, ты не это имел в виду. Мне очень нравится это сообщество, и я уже начал рассказывать другим об этом новом форуме.
Кимбалл

Спасибо за вашу значительную долю. Мне интересно, как я могу использовать набор данных поля в точечной функции для создания прямоугольных буферов, используя предоставленный вами скрипт, не вводя вручную их координаты. Спасибо

Ответы:


47

Попробуйте эти шаги с ArcMap 10:

  1. Буферизируйте свой точечный объект (ArcToolbox> Инструменты анализа> Близость> Буфер). Убедитесь, что в поле Линейный блок выбрано правильное расстояние.
  2. Введите вновь созданные буферы в инструмент Конверт объекта в полигон (Инструменты управления данными> Функции> Конверт объекта в полигон). Обязательно установите флажок «Создать составные элементы», если у вас есть несколько точек.

Для решения Python:

Использование SearchCursor и InsertCursor для создания квадратных буферов

введите описание изображения здесь


2
+1 Ответы, которые демонстрируют решение работ, являются лучшими.
whuber

12

Возможным решением было бы создать ваши «нормальные» круглые буферы, используя стандартный буферный инструмент ESRI с любым желаемым радиусом, а затем выполнить Feature Envelope To Polygon для этого результирующего класса пространственных объектов буферов. Это создает квадратный элемент огибающей вокруг экстента каждого объекта. Конверт объекта в полигон находится в разделе «Управление данными»> «Функции». Модель построителя модели будет выглядеть примерно так:

введите описание изображения здесь


Отличное решение! Кроме того, создавая вывод буфера в виде слоя in_memory (in_memory \ tmpBuffer), вы можете избежать записи ненужных данных на диск и значительно ускорить процесс.
RyanDalton

9

Поскольку скрипт, связанный в конце кода Аарона, можно использовать только для квадратных буферов и не использует более новый модуль arcpy.da, я написал скрипт, который можно использовать для создания прямоугольных буферов. На наборе данных со случайными точками 10 тыс. Он завершился за 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)

5

Предполагая, что вы используете ArcObjects (пожалуйста, используйте теги для указания языка и API, который вы используете), вы можете использовать IEnvelope.Expandдля создания квадратного буфера из конверта точки, как в этом примере: Получить все объекты из поиска точки в фрагменте GeoFeatureLayer

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

1

В качестве альтернативы ответу Аарона, для тех, у кого нет лицензии Advanced, используйте инструмент Minimum Bounding Geometry . Шаги ниже (модифицированные от Аарона):

  1. Буферизируйте свой точечный объект (ArcToolbox> Инструменты анализа> Близость> Буфер). Убедитесь, что в поле Линейный блок выбрано правильное расстояние.
  2. Введите вновь созданные буферы в инструмент « Минимальная ограничивающая геометрия» («Инструменты управления данными»> «Функции»> «Минимальная ограничивающая геометрия»). Используйте «RECTANGLE_BY_AREA» или «RECTANGLE_BY_WIDTH», остальные опции доступны только с расширенной лицензией.

РЕДАКТИРОВАТЬ : эта опция не позволяет вам управлять ориентацией результирующих квадратных буферов, не используя опцию «ENVELOPE» (которая требует расширенной лицензии). Отметив опцию «Добавить геометрические характеристики как атрибуты для вывода (необязательно)», результирующее смещение будет записано как «MBG_Orientation» в выходном классе объектов. Затем это можно использовать для поворота объектов назад по центру, если это необходимо - см. Вращение многоугольников по значению из таблицы атрибутов с использованием ArcPy? для потенциального решения этого.

введите описание изображения здесь


Для моего конкретного класса объектов это заканчивается вращением квадратов в разных направлениях, используя этот рабочий процесс. Возможно, потому что у меня есть перекрывающиеся буферные круги. Не уверена. Я заставил Эсри использовать метод Аарона, описанный выше, в том же классе объектов, и он не вращал буферизованные круги.
Андрей

@ Андрей, да, вы правы, это ограничение инструмента без расширенной лицензии. Использование опции ENVELOPE вернет тот же результат, что и метод Аарона, описанный выше, но также требует расширенной лицензии. Возможный обходной путь - установить флажок «добавить геометрические характеристики в качестве атрибутов», выяснить величину их наклона (должна быть согласованной), а затем повернуть получившиеся квадратные буферы на эту величину в сеансе редактирования. Еще не пробовал это.
Ден Кан

0

На этом сайте описывается, как конвертировать csv в квадратные или прямоугольные или круглые буферы, используя geographiclib JavaScript и js2shapefile.

Вы можете посмотреть, решит ли это вашу проблему.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.