Erstellen eines quadratischen Puffers um ein Punkt-Feature mit ArcGIS for Desktop?


31

Ich möchte einen quadratischen Puffer aus einem Punkt-Feature erstellen, verstehe aber den Code, der darin enthalten ist, nicht.

Ähnliche Fragen wurden auf der Website forums.esri gestellt, aber das war vor über 10 Jahren und es funktionierte nicht, als ich den Code ausprobierte.

Wie erstelle ich einen quadratischen Puffer aus einem Punkt-Feature?


gis.stackexchange.com/questions/12479/… ist im Wesentlichen ein Duplikat (da es sich um eine Verallgemeinerung dieser Frage handelt), aber da es hier bereits gute Antworten gibt, die für quadratische Puffer spezifisch sind, ist es am besten, beide Threads offen zu lassen und trennen, anstatt sie zusammenzuführen. Aber wenn Sie noch mehr Lösungen wollen, lesen Sie auch den anderen Thread!
Whuber

2
OK danke whuber. Ich habe diese Website erst gestern gefunden und bin immer noch damit vertraut. Ich werde versuchen, dies mit meinen zukünftigen Posts / Fragen zu tun. Diese Site gefällt mir viel besser als die ArcGIS-Foren.
Kimball

Ich habe diesen Kommentar in keiner Weise als Kritik verstanden, Kimball: Er war da, um zu verhindern, dass die beiden Themen zusammengeführt werden, das ist alles. Willkommen in unserer Community! (Und bitte erzählen Sie Ihren Freunden von uns, insbesondere denjenigen in den ArcGIS-Foren. :-)
whuber

Recht. Ich weiß, dass du es nicht so gemeint hast. Ich genieße diese Community sehr und habe bereits begonnen, anderen von diesem neuen Forum zu erzählen.
Kimball

Vielen Dank für Ihren signifikanten Anteil. Ich frage mich, wie ich mithilfe des von Ihnen bereitgestellten Skripts mithilfe eines Satzes von Felddaten in Punkt-Features Rechteckpuffer erstellen kann, ohne deren Koordinaten manuell einzugeben. Thanks

Antworten:


47

Probieren Sie diese Schritte mit ArcMap 10 aus:

  1. Puffer Ihre Punktmerkmal (ArcToolbox> Analyse Tools> Nähe> Buffer). Stellen Sie sicher, dass im Feld Lineareinheit der richtige Abstand ausgewählt ist.
  2. Geben Sie Ihre neu erstellten Puffer in das Werkzeug Feature-Hüllkurve in Polygon ein (Datenverwaltungstools> Features> Feature-Hüllkurve in Polygon). Stellen Sie sicher, dass das Kontrollkästchen "Mehrteilige Features erstellen" aktiviert ist, wenn Sie mehrere Punkte haben.

Für eine Python-Lösung:

Verwenden von SearchCursor und InsertCursor zum Erstellen quadratischer Puffer

Bildbeschreibung hier eingeben


2
+1 Antworten, die zeigen, dass die Lösung funktioniert, sind die besten.
Whuber

12

Eine mögliche Lösung besteht darin, Ihre "normalen" runden Puffer mit dem Standard-ESRI-Pufferwerkzeug mit einem beliebigen Radius zu erstellen und dann ein Feature-Envelope-To-Polygon für die resultierende Feature-Class von Puffern auszuführen. Dadurch wird ein quadratisches Hüllkurven-Feature um die Ausdehnung jedes Features erstellt. Feature Envelope to Polygon befindet sich unter Data Management> Features. Das Model Builder-Modell würde etwa so aussehen:

Bildbeschreibung hier eingeben


Hervorragende Lösung! Außerdem können Sie durch Erstellen der Ausgabe des Puffers als in_memory-Ebene (in_memory \ tmpBuffer) das Schreiben nicht benötigter Daten auf die Festplatte vermeiden und den Vorgang erheblich beschleunigen.
RyanDalton

9

Da das Skript, das am Ende von Aarons Code verlinkt ist, nur für quadratische Puffer verwendet werden kann und nicht das neuere arcpy.da-Modul verwendet, habe ich ein Skript geschrieben, mit dem Rechteckpuffer erstellt werden können. Bei einem Datensatz mit 10.000 zufälligen Punkten dauerte es 10 Sekunden:

Bildbeschreibung hier eingeben

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)


1

Als Alternative zu Aarons Antwort können Sie für Benutzer ohne Advanced-Lizenz das Tool Minimum Bounding Geometry verwenden. Schritte unten (modifiziert von Aaron):

  1. Puffer Ihre Punktmerkmal (ArcToolbox> Analyse Tools> Nähe> Buffer). Stellen Sie sicher, dass im Feld Lineareinheit der richtige Abstand ausgewählt ist.
  2. Geben Sie Ihre neu erstellten Puffer in das Werkzeug Minimale Begrenzungsgeometrie ein (Datenverwaltungswerkzeuge> Funktionen> Minimale Begrenzungsgeometrie). Verwenden Sie 'RECTANGLE_BY_AREA' oder 'RECTANGLE_BY_WIDTH', die anderen Optionen sind nur mit einer erweiterten Lizenz verfügbar.

BEARBEITEN : Mit dieser Option können Sie die Ausrichtung der resultierenden quadratischen Puffer nicht steuern, ohne die Option "ENVELOPE" (für die eine erweiterte Lizenz erforderlich ist) zu verwenden. Durch Aktivieren der Option "Geometrieeigenschaften als Attribute zur Ausgabe hinzufügen (optional)" wird der resultierende Versatz als "MBG_Orientation" in der Ausgabe-Feature-Class aufgezeichnet. Auf diese Weise können Sie die Features bei Bedarf zurück in die Mitte drehen. Weitere Informationen finden Sie unter Drehen von Polygonen nach Wert aus der Attributtabelle mit ArcPy ?. für eine mögliche Lösung dafür.

Bildbeschreibung hier eingeben


In meiner speziellen Feature-Class werden die Quadrate mithilfe dieses Workflows in verschiedene Richtungen gedreht. Vielleicht, weil ich überlappende Pufferkreise habe. Nicht sicher. Ich ließ Esri Aarons obige Methode für dieselbe Feature-Class verwenden und die gepufferten Kreise nicht drehen.
Andrew

@Andrew, Sie haben Recht, das ist eine Einschränkung des Tools ohne Advanced License. Die Verwendung der Option ENVELOPE würde dasselbe Ergebnis wie die oben beschriebene Methode von Aaron zurückgeben, erfordert jedoch auch eine erweiterte Lizenz. Eine mögliche Problemumgehung besteht darin, die Option "Geometrieeigenschaften als Attribute hinzufügen" anzukreuzen, den Neigungsgrad zu ermitteln (sollte konsistent sein) und die resultierenden quadratischen Puffer in einer Editiersitzung um diesen Wert zu drehen. Hab das noch nicht ausprobiert.
Dùn Caan

0

Diese Site beschreibt, wie man csv mit Hilfe von JavaScript und js2shapefile von geographiclib in quadratische, rechteckige oder kreisförmige Puffer konvertiert.

Sie können nachsehen, ob dies Ihr Problem löst.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.