Jag skulle vilja skapa en fyrkantig buffert från en punktfunktion men jag förstår inte koden som finns i den.
Liknande frågor har ställts på forums.esri-webbplatsen men det var för över tio år sedan och det fungerade inte när jag försökte koden.
Hur skapar jag en fyrkant buffert från en punktfunktion?
Kommentarer
- gis.stackexchange.com/questions/12479 / … är i huvudsak en duplikat (eftersom det tar upp en generalisering av denna fråga), men eftersom det redan finns bra svar här som är specifika för fyrkantiga buffertar, verkar det bäst att lämna båda trådarna öppna och separera snarare än att slå ihop dem. Men om du vill ha fler lösningar, läs den andra tråden också!
- OK tack whuber. Jag hittade just den här webbplatsen igår och jag ’ är fortfarande bekant med den. Jag ’ Jag försöker göra det med mina framtida inlägg / frågor. Jag ’ tycker om den här webbplatsen mycket bättre än ArcGIS-forumen.
- Jag menade inte ’ t menade den kommentaren som kritik på något sätt, Kimball: det var där för att förhindra att de två trådarna slogs samman, att ’ är allt. Välkommen till vårt samhälle! (Och berätta för dina vänner om oss, särskilt de på ArcGIS-forumen. 🙂
- Rätt. Jag vet att du inte ’ inte menade det på det sättet. Jag tycker mycket om denna gemenskap och har redan börjat berätta för andra om detta nya forum.
- Tack för din betydande andel. Jag undrar hur jag kan använda en uppsättning fältdata i punktfunktionen för att skapa rektangelbuffertar med hjälp av det skript du tillhandahåller utan att manuellt skriva deras koordinater. Tack
Svar
Prova dessa steg med ArcMap 10:
- Buffert din punktfunktion (ArcToolbox> Analysverktyg> Närhet> Buffert). Se till att du väljer rätt avstånd i rutan Linjär enhet.
- Mata in dina nyskapade buffertar i verktyget Feature Kuvert till polygon (data Management Tools> Features> Feature Kuvert till polygon). Se till att markera rutan ”Skapa multpart-funktioner” om du har flera punkter.
För en Python-lösning:
Använda SearchCursor och InsertCursor för att skapa fyrkantiga buffertar
Kommentarer
- +1 Svar som visar att lösningen fungerar är bäst.
Svar
En möjlig lösning skulle vara att skapa dina ”normala” runda buffertar med hjälp av standard ESRI-buffertverktyget med vilken radie du helst vill och sedan utföra ett Feature Kuvert till polygon på den resulterande funktionsklassen buffertar. Detta skapar en fyrkantig kuvertfunktion kring omfattningen av varje funktion. Feature Envelope to Polygon finns i Data Management> Features. Modellbyggmodellen ser ut som:
Kommentarer
- Utmärkt lösning! Genom att skapa buffertens utdata som ett in_memory-lager (in_memory \ tmpBuffer) så kan du undvika att skriva onödiga data till disk och göra processen mycket snabbare.
Svar
Eftersom skriptet som är länkat i slutet av Arons kod bara kan användas för fyrkantiga buffertar och inte använder den nyare arcpy.da-modulen använder jag ”har skrivit ett skript som kan användas för att skapa rektangelbuffertar. På en 10k slumpmässig punktuppsättning slutfördes den på tio sekunder:
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)
Svar
Om du antar att du använder ArcObjects (använd taggarna för att ange språk och API som du använder) kan du använda IEnvelope.Expand
för att skapa en fyrkantig buffert från ett punkts kuvert, som i detta exempel: Få alla funktioner från punktsökning i GeoFea tureLayer-kodavsnitt
ESRI.ArcGIS.Geometry.IEnvelope envelope = point.Envelope; envelope.Expand(searchTolerance, searchTolerance, false);
Svar
Som ett alternativ till Arons svar, för dem utan avancerad licens, använd verktyget Minimum Bounding Geometry . Steg nedan (modifierad från Aaron):
- Buffert din poängfunktion (ArcToolbox> Analysverktyg> Närhet> Buffert). Se till att du väljer rätt avstånd i rutan Linjär enhet.
- Mata in dina nyskapade buffertar i verktyget Minsta gränsgeometri (Verktyg för datahantering> Funktioner> Minsta gränsgeometri). Använd ”RECTANGLE_BY_AREA” eller ”RECTANGLE_BY_WIDTH”, de andra alternativen är endast tillgängliga med en avancerad licens.
EDIT : Det här alternativet låter dig inte styra orienteringen för de resulterande fyrkantiga buffertarna utan att använda alternativet” ENVELOPE ”(som kräver en avancerad licens). Genom att markera” Lägg till geometriegenskaper som attribut för utdata ( valfritt) ”alternativ – den resulterande förskjutningen registreras som” MBG_Orientation ”i utdatafunktionsklassen. Detta kan sedan användas för att rotera funktionerna tillbaka till mitten om så önskas – se Roterande polygoner efter värde från attributtabellen med ArcPy? för en potentiell lösning på det.
Kommentarer
- För min specifika funktionsklass hamnar det med att rotera rutorna i olika riktningar med hjälp av detta arbetsflöde. Kanske för att jag har överlappande buffertcirklar. Vet inte. Jag fick Esri att använda Aaron ’ s metod ovan på samma funktionsklass och den roterade inte de buffrade cirklarna.
- @Andrew, ja du ’ är rätt, det är en begränsning av verktyget utan en avancerad licens. Att använda alternativet ENVELOPE skulle ge samma resultat som Aaron ’ -metoden ovan, men behöver också en avancerad licens. En möjlig lösning skulle vara att kryssa för ’ lägga till geometriegenskaper som attribut ’, ta reda på mängden de lutas (bör vara konsekvent ), rotera sedan de resulterande fyrkantiga buffertarna med det beloppet i en redigeringssession. Haven ’ t har testat det ännu.
Svar
Detta webbplats beskriver hur man konverterar csv till kvadrat- eller rektangel- eller cirkelbuffertar med geographiclib JavaScript och js2shapefile.
Du kan titta om det löser sig ditt problem.