Creazione del buffer quadrato attorno alla funzione punto usando ArcGIS per desktop?


31

Vorrei creare un buffer quadrato da una funzione punto ma non capisco il codice che lo contiene.

Domande simili sono state poste sul sito Web forums.esri, ma è successo più di 10 anni fa e non ha funzionato quando ho provato il codice.

Come posso creare un buffer quadrato da una funzione punto?


gis.stackexchange.com/questions/12479/… è essenzialmente un duplicato (perché affronta una generalizzazione di questa domanda), ma poiché ci sono già buone risposte qui che sono specifiche per i buffer quadrati, sembra meglio lasciare entrambi i thread aperti e separati piuttosto che fonderli. Ma se vuoi ancora più soluzioni, leggi anche l'altro thread!
whuber

2
OK grazie whuber. Ho appena trovato questo sito ieri e lo sto ancora familiarizzando. Proverò a farlo con i miei post / domande futuri. Questo sito mi piace molto meglio dei forum ArcGIS.
Kimball,

Non intendevo in alcun modo quel commento come critica, Kimball: era lì per impedire di unire i due fili, tutto qui. Benvenuto nella nostra comunità! (E per favore, racconta ai tuoi amici di noi, in particolare quelli sui forum ArcGIS. :-)
whuber

Destra. So che non intendevi in ​​quel modo. Mi piace molto questa community e ho già iniziato a parlare ad altri di questo nuovo forum.
Kimball,

Grazie per la tua significativa partecipazione. Mi chiedo come posso usare un insieme di dati di campo nella funzione punto per creare buffer rettangolari usando lo script fornito senza digitare manualmente le loro coordinate. Grazie

Risposte:


47

Prova questi passaggi con ArcMap 10:

  1. Buffer la tua funzione punto (ArcToolbox> Strumenti di analisi> Prossimità> Buffer). Assicurarsi di selezionare la distanza corretta nella casella Unità lineare.
  2. Inserisci i buffer appena creati nello strumento Inviluppo funzioni su poligono (Strumenti di gestione dati> Funzioni> Inviluppo funzioni su poligono). Assicurati di selezionare la casella "Crea funzionalità in più parti" se hai più punti.

Per una soluzione Python:

Utilizzo di SearchCursor e InsertCursor per creare buffer quadrati

inserisci qui la descrizione dell'immagine


2
+1 Le risposte che dimostrano che la soluzione funziona sono le migliori.
whuber

12

Una possibile soluzione sarebbe quella di creare i vostri "normali" buffer rotondi usando lo strumento buffer ESRI standard con qualsiasi raggio desideriate e quindi eseguendo un inviluppo di funzionalità al poligono su quella classe di buffer di caratteristiche risultante. Ciò crea una funzione di inviluppo quadrato attorno all'estensione di ciascuna funzione. La funzione Inviluppo poligono si trova in Gestione dati> Funzioni. Il modello del modello builder sarebbe simile a:

inserisci qui la descrizione dell'immagine


Ottima soluzione! Inoltre, creando l'output del buffer come layer in_memory (in_memory \ tmpBuffer) e si può evitare di scrivere dati non necessari sul disco e rendere il processo molto più veloce.
Ryan Dalton,

9

Poiché lo script collegato alla fine del codice di Aaron può essere utilizzato solo per i buffer quadrati e non utilizza il nuovo modulo arcpy.da, ho scritto uno script che può essere utilizzato per creare buffer rettangolari. In un set di dati a punti casuali da 10k, è stato completato in 10 secondi:

inserisci qui la descrizione dell'immagine

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

In alternativa alla risposta di Aaron, per coloro che non dispongono di una licenza avanzata, utilizzare lo strumento Geometria minima di confine . Passaggi di seguito (modificati da Aaron):

  1. Buffer la tua funzione punto (ArcToolbox> Strumenti di analisi> Prossimità> Buffer). Assicurarsi di selezionare la distanza corretta nella casella Unità lineare.
  2. Inserisci i tuoi buffer appena creati nello strumento Geometria minima del limite (Strumenti di gestione dei dati> Funzionalità> Geometria minima del limite). Utilizza "RECTANGLE_BY_AREA" o "RECTANGLE_BY_WIDTH", le altre opzioni sono disponibili solo con una licenza avanzata.

MODIFICA : questa opzione non consente di controllare l'orientamento dei buffer quadrati risultanti, senza utilizzare l'opzione 'ENVELOPE' (che richiede una licenza avanzata). Spuntando l'opzione "Aggiungi caratteristiche geometriche come attributi all'output (opzionale)", l'offset risultante verrà registrato come "MBG_Orientation" nella classe di feature di output. Questo può quindi essere usato per ruotare le funzioni al centro, se lo si desidera - vedi Ruotare poligoni in base al valore dalla tabella degli attributi usando ArcPy? per una potenziale soluzione a questo.

inserisci qui la descrizione dell'immagine


Per la mia particolare classe di funzioni, questo flusso di lavoro finisce per ruotare i quadrati in diverse direzioni. Forse perché ho cerchi buffer sovrapposti. Non sono sicuro. Ho avuto Esri usare il metodo di Aaron sopra nella mia stessa classe di caratteristiche e non ha ruotato i cerchi bufferati.
Andrew

@Andrew, sì hai ragione, questa è una limitazione dello strumento senza una licenza avanzata. L'uso dell'opzione ENVELOPE restituirebbe lo stesso risultato del metodo di Aaron sopra, ma necessita anche di una licenza avanzata. Una possibile soluzione alternativa sarebbe spuntare l'opzione "aggiungi caratteristiche geometriche come attributi", scoprire la quantità di inclinazione (dovrebbe essere coerente), quindi ruotare i buffer quadrati risultanti di tale quantità in una sessione di modifica. Non l'ho ancora provato.
Dùn Caan,

0

Questo sito descrive come convertire i buffer csv in buffer quadrati o rettangolari o circolari usando geographiclib JavaScript e js2shapefile.

Puoi dare un'occhiata se risolve il tuo problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.