Chciałbym utworzyć kwadratowy bufor z obiektu punktowego, ale nie rozumiem kodu, który do niego trafia.
Podobne pytania zadawano na stronie forums.esri, ale było to ponad 10 lat temu i nie zadziałało, gdy próbowałem kodu.
Jak utworzyć kwadrat bufor z obiektu punktowego?
Komentarze
- gis.stackexchange.com/questions/12479 / … jest zasadniczo duplikatem (ponieważ odnosi się do uogólnienia tego pytania), ale ponieważ są już tutaj dobre odpowiedzi, które są specyficzne dla buforów kwadratowych, wydaje się, że najlepiej pozostawić oba wątki otwarte i rozdzielić, zamiast je łączyć. Ale jeśli chcesz więcej rozwiązań, przeczytaj też inny wątek!
- OK, dzięki whuber. Właśnie wczoraj znalazłem tę witrynę i ' nadal się z nią zapoznaję. Spróbuję ' zrobić to z moimi przyszłymi postami / pytaniami. ' podoba mi się ta witryna dużo bardziej niż fora ArcGIS.
- Nie ' nie miałem na myśli tego komentarza jako krytykę w jakikolwiek sposób, Kimball: było to po to, aby zapobiec połączeniu dwóch wątków, ' jest wszystkim. Witamy w naszej społeczności! (I proszę, powiedz o nas swoim znajomym, zwłaszcza tym na forach ArcGIS. 🙂
- Dobrze. Wiem, że nie ' nie miałeś tego na myśli. Bardzo podoba mi się ta społeczność i już zacząłem opowiadać innym o tym nowym forum.
- Dziękuję za znaczący udział. Zastanawiam się, jak mogę użyć zestawu danych pola w funkcji punktu do tworzenia buforów prostokątnych za pomocą dostarczonego skryptu bez ręcznego wpisywania ich współrzędnych. Dzięki
Odpowiedź
Spróbuj wykonać poniższe czynności z ArcMap 10:
- Bufor elementu punktu (ArcToolbox> Narzędzia analizy> Bliskość> Bufor). Upewnij się, że wybrałeś prawidłową odległość w polu Jednostka liniowa.
- Wprowadź nowo utworzone bufory do narzędzia Obwiednia elementu do wielokąta (Dane Narzędzia zarządzania> Operacje> Obwiednia elementu do wielokąta). Pamiętaj, aby zaznaczyć pole „Utwórz funkcje wieloczęściowe”, jeśli masz wiele punktów.
Rozwiązanie w języku Python:
Używanie SearchCursor i InsertCursor do tworzenia kwadratowych buforów
Komentarze
- +1 Odpowiedzi, które pokazują, że rozwiązanie działa, są najlepsze.
Odpowiedź
Możliwym rozwiązaniem byłoby utworzenie „normalnych” okrągłych buforów przy użyciu standardowego narzędzia bufora ESRI o dowolnym promieniu, a następnie wykonanie operacji Obwiednia elementu do wielokąta na wynikowej klasie obiektów buforów. Tworzy to kwadratową obwiednię wokół zakresu każdego elementu. Obwiednia funkcji do wielokąta znajduje się w obszarze Zarządzanie danymi> Funkcje. Model narzędzia do tworzenia modeli wyglądałby podobnie do:
Komentarze
- Doskonałe rozwiązanie! Ponadto, tworząc dane wyjściowe bufora jako warstwę in_memory (in_memory \ tmpBuffer), możesz uniknąć zapisywania niepotrzebnych danych na dysk i znacznie przyspieszyć proces.
Odpowiedź
Ponieważ skrypt dowiązany na końcu kodu Aarona może być używany tylko do buforów kwadratowych i nie korzysta z nowszego modułu arcpy.da, ja „Napisałem skrypt, który może być użyty do tworzenia buforów prostokątnych. W przypadku zbioru danych o losowych punktach 10 tys., proces ten zajął 10 sekund:
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)
Odpowiedź
Zakładając, że” używasz ArcObjects (użyj tagów, aby określić używany język i API), możesz użyć IEnvelope.Expand
, aby utworzyć kwadratowy bufor z obwiedni punktu, jak w tym przykładzie: Pobierz wszystkie funkcje z wyszukiwania punktów w GeoFea Snippet tureLayer
ESRI.ArcGIS.Geometry.IEnvelope envelope = point.Envelope; envelope.Expand(searchTolerance, searchTolerance, false);
Odpowiedź
Jako alternatywę dla odpowiedzi Aarona, dla osób bez licencji zaawansowanej użyj narzędzia Minimalna geometria graniczna . Kroki poniżej (zmodyfikowane przez Aarona):
- Bufor elementu punktu (ArcToolbox> Narzędzia analizy> Bliskość> Bufor). Upewnij się, że wybrano prawidłową odległość w polu Jednostka liniowa.
- Wprowadź nowo utworzone bufory do narzędzia Minimalna geometria graniczna (Narzędzia do zarządzania danymi> Funkcje> Minimalna geometria graniczna). Użyj „RECTANGLE_BY_AREA” lub „RECTANGLE_BY_WIDTH”, pozostałe opcje są dostępne tylko z licencją zaawansowaną.
EDYTUJ : Ta opcja nie pozwala na kontrolowanie orientacji wynikowych buforów kwadratowych bez użycia opcji” KOPERTA „(która wymaga licencji zaawansowanej). Zaznaczając opcję” Dodaj cechy geometrii jako atrybuty do wyprowadzenia ( opcjonalna) „opcja – wynikowe przesunięcie zostanie zapisane jako” MBG_Orientation „w klasie elementów wyjściowych. Można to następnie użyć do obrócenia elementów z powrotem do środka, jeśli jest taka potrzeba – patrz Obracanie wielokątów według wartości z tabeli atrybutów przy użyciu ArcPy? , aby znaleźć potencjalne rozwiązanie tego problemu.
Komentarze
- 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. Może dlatego, że tak nakładające się okręgi bufora. Niepewny. Kazałem Esri używać metody Aarona ' powyżej w tej samej klasie obiektów i nie obracała buforowanych okręgów.
- @Andrew, tak ' re right, czyli ograniczenie narzędzia bez Licencji Zaawansowanej. Użycie opcji ENVELOPE zwróci ten sam wynik, co powyższa metoda Aarona ', ale wymaga również Licencji Zaawansowanej. Potencjalnym obejściem byłoby zaznaczenie opcji ' dodanie cech geometrii jako atrybutów ' i sprawdzenie, o ile są nachylone (powinno być spójne ), a następnie obróć otrzymane kwadratowe bufory o tę wielkość w sesji edycji. Nie próbowałem jeszcze '.