Jeg vil lage en firkantbuffer fra en punktfunksjon, men jeg forstår ikke koden som ligger i den.
Lignende spørsmål har blitt stilt på forums.esri-nettstedet, men det var for over 10 år siden, og det fungerte ikke da jeg prøvde koden.
Hvordan lager jeg en firkant buffer fra en punktfunksjon?
Kommentarer
- gis.stackexchange.com/questions/12479 / … er egentlig et duplikat (fordi det adresserer en generalisering av dette spørsmålet), men siden det allerede er gode svar her som er spesifikke for firkantbuffere, virker det best å la begge trådene være åpne og skille i stedet for å slå dem sammen. Men hvis du vil ha flere løsninger, kan du lese den andre tråden også!
- OK takk whuber. Jeg fant nettstedet i går, og jeg ‘ er fortsatt kjent med det. Jeg ‘ Jeg prøver å gjøre det med mine fremtidige innlegg / spørsmål. Jeg ‘ liker dette nettstedet mye bedre enn ArcGIS-forumene.
- Jeg mente ikke ‘ t mener den kommentaren som kritikk på noen måte, Kimball: det var der for å forhindre sammenslåing av de to trådene, at ‘ er alt. Velkommen til samfunnet vårt! (Og fortell vennene dine om oss, spesielt de på ArcGIS-forumene. 🙂
- Ikke sant. Jeg vet at du ikke ‘ ikke mente det på den måten. Jeg liker dette samfunnet veldig mye og har allerede begynt å fortelle andre om dette nye forumet.
- Takk for din betydelige andel. Jeg lurer på hvordan jeg kan bruke et sett med feltdata i punktfunksjon for å lage rektangelbuffere ved hjelp av skriptet du oppgir uten å manuelt skrive inn koordinatene. Takk
Svar
Prøv disse trinnene med ArcMap 10:
- Buffer poengfunksjonen din (ArcToolbox> Analyseverktøy> Nærhet> Buffer). Sørg for å velge riktig avstand i feltet Linjær enhet.
- Skriv inn de nyopprettede bufferne i verktøyet Feature Envelope to Polygon (Data Management Tools> Features> Feature Envelope to Polygon). Sørg for å merke av for «Opprett multpartfunksjoner» hvis du har flere poeng.
For en Python-løsning:
Bruke SearchCursor og InsertCursor til å lage firkantbuffere
Kommentarer
- +1 Svar som viser at løsningen fungerer er best.
Svar
En mulig løsning vil være å lage dine «normale» runde buffere ved hjelp av standard ESRI-bufferverktøy med hvilken radius du vil, og deretter utføre en Feature Envelope To Polygon på den resulterende funksjonsklassen buffere. Dette skaper en firkantet konvoluttfunksjon rundt omfanget av hver funksjon. Feature Envelope to Polygon ligger i Data Management> Features. Modellbyggermodellen ser ut som:
Kommentarer
- Utmerket løsning! Ved å opprette utdataene fra bufferen som et in_memory-lag (in_memory \ tmpBuffer), kan du unngå å skrive unødvendige data på disken, og gjøre prosessen mye raskere.
Svar
Siden skriptet som er koblet på slutten av Arons kode, bare kan brukes til firkantbuffere og ikke bruker den nyere arcpy.da-modulen, «har skrevet et skript som kan brukes til å lage rektangelbuffere. På et 10 k tilfeldig punkt datasett fullførte det på 10 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
Forutsatt at du bruker ArcObjects (vennligst bruk kodene for å spesifisere språket og API-en du bruker), kan du bruke IEnvelope.Expand
for å lage en firkantbuffer fra en punktkonvolutt, som i dette eksemplet: Få alle funksjoner fra punktsøk i GeoFea tureLayer-kodebit
ESRI.ArcGIS.Geometry.IEnvelope envelope = point.Envelope; envelope.Expand(searchTolerance, searchTolerance, false);
Svar
Som et alternativ til Arons svar, for de uten avansert lisens, bruk verktøyet Minimum Bounding Geometry . Trinn nedenfor (modifisert fra Aaron):
- Buffer poengfunksjonen din (ArcToolbox> Analyseverktøy> Nærhet> Buffer). Forsikre deg om at du velger riktig avstand i boksen Lineær enhet.
- Legg inn de nyopprettede bufferne dine i verktøyet Minimum Bounding Geometry (Data Management Tools> Features> Minimum Bounding Geometry). Bruk «RECTANGLE_BY_AREA» eller «RECTANGLE_BY_WIDTH», de andre alternativene er bare tilgjengelige med en avansert lisens.
EDIT : Dette alternativet lar deg ikke kontrollere retningen til de resulterende firkantbufferne uten å bruke alternativet» ENVELOPE «(som krever en avansert lisens). Ved å merke av for» Legg til geometriegenskaper som attributter til utdata ( valgfritt) «alternativ – den resulterende forskyvningen blir registrert som» MBG_Orientation «i utgangsfunksjonsklassen. Denne kan deretter brukes til å rotere funksjonene tilbake til sentrum hvis ønskelig – se polygoner etter verdi fra attributtabellen ved hjelp av ArcPy? for en mulig løsning på det.
Kommentarer
- For min spesielle funksjonsklasse ender det med å rotere rutene i forskjellige retninger ved hjelp av denne arbeidsflyten. Kanskje fordi jeg har det overlappende buffersirkler. Ikke sikker. Jeg fikk Esri til å bruke Aaron ‘ s metode ovenfor på min samme funksjonsklasse, og den roterte ikke de bufrede sirkler.
- @Andrew, jepp ‘ har rett, det er en begrensning av verktøyet uten en avansert lisens. Å bruke alternativet ENVELOPE ville gi samme resultat som Aaron ‘ -metoden ovenfor, men trenger også en avansert lisens. En potensiell løsning vil være å krysse av ‘ legge til geometriegenskaper som attributter ‘, finne ut hvor mye de er vippet (bør være konsistent ), og roter deretter de resulterende firkantbufferne med det beløpet i en redigeringsøkt. Har ikke ‘ t prøvd dette ennå.
Svar
Dette nettsted beskriver hvordan du konverterer csv til firkantede eller rektangulære eller sirkelbuffere ved hjelp av geografisklib JavaScript og js2shapefile.
Du kan se om det løser problemet ditt.