Створення квадратного буфера навколо функції точки за допомогою ArcGIS for Desktop?


31

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

Подібні запитання задавались на веб-сайті forums.esri, але це було більше 10 років тому, і це не спрацювало, коли я спробував код.

Як створити квадратний буфер з точкової функції?


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

2
Гаразд, дякую шубер. Я щойно знайшов цей веб-сайт вчора і досі знайомиться з ним. Я спробую це зробити зі своїми майбутніми повідомленнями / питаннями. Мені цей сайт подобається набагато краще, ніж форуми ArcGIS.
Кімбол

Я не мав на увазі цей коментар як критику в жодному разі, Кімбол: саме там було завадити злиття двох потоків, ось і все. Ласкаво просимо до нашої спільноти! (І скажіть, будь ласка, своїм друзям про нас, особливо тим, хто на форумах ArcGIS. :-)
whuber

Правильно. Я знаю, ти так не мав на увазі. Мені дуже подобається ця спільнота і вже почали розповідати іншим про цей новий форум.
Кімбол

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

Відповіді:


47

Спробуйте виконати наступні дії з ArcMap 10:

  1. Буфер вашої функції точки (ArcToolbox> Analysis Tools> Proximity> Buffer). Переконайтесь, що в полі Лінійний блок вибрати правильну відстань.
  2. Введіть ваші новостворені буфери в інструмент « Конверт функцій до полігону » (Інструменти управління даними> Особливості> Конверт функцій у полігон). Обов’язково виберіть поле "Створити багатопоточні функції", якщо у вас є кілька точок.

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

Використання SearchCursor та InsertCursor для створення квадратних буферів

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


2
+1 Відповіді, які демонструють рішення роботи, є найкращими.
whuber

12

Можливим рішенням було б створити ваші "звичайні" круглі буфери, використовуючи стандартний інструмент буфера ESRI з будь-яким радіусом, який ви хотіли, а потім виконати конверт функцій для багатокутника на тому результативному класі буферів. Це створює функцію квадратної конвертики навколо масштабу кожної функції. Конверт функцій для багатокутника розташований у розділі Управління даними> Функції. Модель конструктора моделей буде схожа на:

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


Відмінне рішення! Крім того, створивши висновок буфера як шару 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 Snippet

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

1

В якості альтернативи відповіді Аарона, для тих, хто не має розширеної ліцензії, використовуйте інструмент " Мінімальна гранична геометрія" . Нижче описані кроки (модифіковано від Aaron):

  1. Буфер вашої функції точки (ArcToolbox> Analysis Tools> Proximity> Buffer). Переконайтесь, що в полі Лінійний блок вибрати правильну відстань.
  2. Введіть новостворені буфери в інструмент " Мінімальна обмежувальна геометрія" (Інструменти управління даними> Особливості> Мінімальна геометрія обмеження). Використовуйте "RECTANGLE_BY_AREA" або "RECTANGLE_BY_WIDTH", інші варіанти доступні лише з розширеною ліцензією.

EDIT : Цей параметр не дозволяє контролювати орієнтацію отриманих квадратних буферів, не використовуючи параметр 'ENVELOPE' (для чого потрібна розширена ліцензія). Позначевши опцію "Додати геометричні характеристики як атрибути до виводу (необов'язково)" - отримане зміщення буде записано як "MBG_Orientation" у вихідному класі функцій. Потім це може бути використане для обертання функцій назад до центру - див. Обертання багатокутників за значенням з таблиці атрибутів за допомогою ArcPy? для потенційного вирішення цього питання.

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


Для мого особливого класу функцій він закінчується обертанням квадратів у різних напрямках, використовуючи цей робочий процес. Можливо тому, що у мене буферні кола, що перекриваються. Не впевнений. Я мав застосування Есрі вище за методом Аарона в моєму ж классі функцій, і він не обертав буферні кола.
Андрій

@Andrew, так, ви праві, це обмеження інструменту без розширеної ліцензії. Використання параметра ENVELOPE поверне той самий результат, що і метод Аарона вище, але також потребує розширеної ліцензії. Потенційним рішенням може бути позначка параметра "додати характеристики геометрії як атрибутів", з'ясувати кількість, на яку вони нахилені (повинна відповідати), а потім повернути отримані квадратні буфери на цю суму в сесії редагування. Ще не пробував цього.
Dùn Caan

0

На цьому веб-сайті описано, як перетворити csv в квадратні або прямокутні або кругові буфери за допомогою Geographiclib JavaScript та js2shapefile.

Ви можете подивитися, якщо це вирішить вашу проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.