Czy tworzysz kwadratowy bufor wokół punktu za pomocą ArcGIS na komputery?

31

Chciałbym utworzyć kwadratowy bufor z elementu punktowego, ale nie rozumiem kodu, który się w nim znajduje.

Podobne pytania zostały zadane na stronie forums.esri, ale było to ponad 10 lat temu i nie zadziałało, kiedy wypróbowałem kod.

Jak utworzyć kwadratowy bufor z elementu punktowego?

Kimball
źródło
gis.stackexchange.com/questions/12479/... jest zasadniczo duplikatem (ponieważ dotyczy uogólnienia tego pytania), ale ponieważ istnieją już dobre odpowiedzi specyficzne dla buforów kwadratowych, najlepiej pozostawić oba wątki otwarte i oddzielaj, a nie łącząc je. Ale jeśli chcesz jeszcze więcej rozwiązań, przeczytaj także drugi wątek!
whuber
2
OK, dzięki. Właśnie znalazłem tę stronę wczoraj i wciąż się z nią zapoznam. Spróbuję to zrobić z moimi przyszłymi postami / pytaniami. Podoba mi się ta strona znacznie lepiej niż fora ArcGIS.
Kimball,
Nie miałem na myśli tego komentarza jako krytyki w jakikolwiek sposób, Kimball: miał on zapobiec łączeniu się dwóch wątków, to wszystko. Witamy w naszej społeczności! (I powiedz o nas znajomym, zwłaszcza tym na forach ArcGIS. :-)
whuber
Dobrze. Wiem, że nie miałeś tego na myśli. Bardzo lubię tę społeczność i już zacząłem opowiadać innym o tym nowym forum.
Kimball,
Dziękuję za wasz znaczący udział. Zastanawiam się, jak mogę użyć zestawu danych pola w operacji punktowej do tworzenia buforów prostokątów za pomocą skryptu, który udostępniasz, bez ręcznego wpisywania ich współrzędnych. Dzięki

Odpowiedzi:

47

Wypróbuj następujące kroki z ArcMap 10:

  1. Buforuj swój punkt (ArcToolbox> Narzędzia analizy> Bliskość> Bufor). Upewnij się, że wybrano prawidłową odległość w polu Jednostka liniowa.
  2. Wprowadź nowo utworzone bufory do narzędzia Koperta elementów do wielokąta (Narzędzia zarządzania danymi> Funkcje> Koperta elementów do wielokąta). Jeśli masz wiele punktów, zaznacz pole „Utwórz funkcje wielu elementów”.

W przypadku rozwiązania Python:

Używanie SearchCursor i InsertCursor do tworzenia kwadratowych buforów

wprowadź opis zdjęcia tutaj

Aaron
źródło
2
Odpowiedzi +1, które pokazują, że rozwiązanie działa, są najlepsze.
whuber
12

Możliwym rozwiązaniem byłoby utworzenie „normalnych” okrągłych buforów za pomocą standardowego narzędzia buforującego ESRI o dowolnym promieniu, a następnie wykonanie Obwiedni cech dla wielokąta na tej wynikowej klasie buforów. Tworzy to kwadratową obwiednię wokół zakresu każdej cechy. Koperta operacji na wielokącie znajduje się w obszarze Zarządzanie danymi> Funkcje. Model konstruktora modeli wyglądałby podobnie do:

wprowadź opis zdjęcia tutaj

Wysokość
źródło
Doskonałe rozwiązanie! Ponadto, tworząc wyjście bufora jako warstwę in_memory (in_memory \ tmpBuffer), można uniknąć zapisywania niepotrzebnych danych na dysku i znacznie przyspieszyć proces.
RyanDalton,
9

Ponieważ skrypt połączony na końcu kodu Aarona może być używany tylko do buforów kwadratowych i nie korzysta z nowszego modułu arcpy.da, napisałem skrypt, którego można użyć do tworzenia buforów prostokątnych. W przypadku zbioru danych o losowych punktach o wielkości 10 000 wykonano go w 10 sekund:

wprowadź opis zdjęcia tutaj

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)
Paweł
źródło
1

Jako alternatywę dla odpowiedzi Aarona, dla osób bez licencji Advanced, użyj narzędzia Minimalna geometria ograniczająca . Kroki poniżej (zmodyfikowane z Aaron):

  1. Buforuj swój punkt (ArcToolbox> Narzędzia analizy> Bliskość> Bufor). Upewnij się, że wybrano prawidłową odległość w polu Jednostka liniowa.
  2. Wprowadź nowo utworzone bufory do narzędzia Minimalna geometria ograniczająca (Narzędzia zarządzania danymi> Funkcje> Minimalna geometria ograniczająca). Użyj „RECTANGLE_BY_AREA” lub „RECTANGLE_BY_WIDTH”, pozostałe opcje są dostępne tylko z licencją Advanced.

EDYCJA : Ta opcja nie pozwala kontrolować orientacji wynikowych buforów kwadratowych bez użycia opcji „KOPERTA” (która wymaga licencji Advanced). Zaznaczając opcję „Dodaj cechy geometryczne jako atrybuty do danych wyjściowych (opcjonalnie)” - wynikowe przesunięcie zostanie zapisane jako „MBG_Orientation” w klasie obiektów wyjściowych. W razie potrzeby można to wykorzystać do obrócenia elementów z powrotem do środka - patrz Obracanie wielokątów według wartości z tabeli atrybutów za pomocą ArcPy? dla potencjalnego rozwiązania tego.

wprowadź opis zdjęcia tutaj

Dan Caan
źródło
W przypadku mojej konkretnej klasy obiektów kończy się to obracaniem kwadratów w różnych kierunkach przy użyciu tego przepływu pracy. Być może dlatego, że mam nakładające się kręgi buforowe. Niepewny. Kazałem Esri zastosować powyższą metodę Aarona na tej samej klasie obiektów i nie obracała ona buforowanych kół.
Andrew
@Andrew, tak, masz rację, to jest ograniczenie narzędzia bez licencji Advanced. Użycie opcji KOPERTA zwróciłoby ten sam wynik, co w powyższej metodzie Aarona, ale także wymaga licencji zaawansowanej. Potencjalnym obejściem byłoby zaznaczenie opcji „dodaj cechy geometrii jako atrybuty”, ustalenie wysokości, o jaką są przechylane (powinny być spójne), a następnie obrócenie wynikowych buforów kwadratowych o tę wartość w sesji edycji. Jeszcze tego nie próbowałem.
Dùn Caan
0

Ta strona opisuje, jak przekonwertować csv na bufory kwadratowe, prostokątne lub kołowe za pomocą JavaScript Geographiclib i js2shapefile.

Możesz sprawdzić, czy to rozwiąże twój problem.

GeoSpatialEarth.in
źródło