Criando buffer quadrado em torno do recurso de ponto usando o ArcGIS for Desktop?

31

Gostaria de criar um buffer quadrado a partir de um recurso de ponto, mas não entendo o código que entra nele.

Perguntas semelhantes foram feitas no site forums.esri, mas isso foi há mais de 10 anos e não funcionou quando tentei o código.

Como crio um buffer quadrado a partir de um recurso de ponto?

Kimball
fonte
gis.stackexchange.com/questions/12479/… é essencialmente uma duplicata (porque aborda uma generalização desta pergunta), mas como já existem boas respostas aqui específicas para buffers quadrados, parece melhor deixar os dois threads abertos e separar em vez de fundi-los. Mas se você quiser mais soluções, leia o outro tópico também!
whuber
2
OK, obrigado whuber. Acabei de encontrar este site ontem e ainda estou me familiarizando com ele. Vou tentar fazer isso com minhas futuras postagens / perguntas. Estou gostando muito mais deste site do que nos fóruns do ArcGIS.
22712 Kimball
Não quis dizer esse comentário como crítica, Kimball: estava lá para impedir a fusão dos dois tópicos, só isso. Bem vindo à nossa comunidade! (E conte a seus amigos sobre nós, especialmente aqueles nos fóruns do ArcGIS. :-)
whuber
Direita. Eu sei que você não quis dizer isso dessa maneira. Gosto muito dessa comunidade e já comecei a contar aos outros sobre esse novo fórum.
Kimball
Obrigado por sua participação significativa. Gostaria de saber como posso usar um conjunto de dados de campo no recurso de ponto para criar buffers de retângulo usando o script que você fornece sem digitar manualmente suas coordenadas. Graças

Respostas:

47

Tente estas etapas com o ArcMap 10:

  1. Buffer seu recurso de ponto (ArcToolbox> Ferramentas de análise> Proximidade> Buffer). Certifique-se de selecionar a distância correta na caixa Unidade linear.
  2. Insira seus buffers recém-criados na ferramenta Feature Envelope to Polygon (Ferramentas de gerenciamento de dados> Recursos> Feature Envelope to Polygon). Certifique-se de selecionar a caixa "Criar recursos de várias partes" se você tiver vários pontos.

Para uma solução Python:

Usando o SearchCursor e o InsertCursor para criar buffers quadrados

insira a descrição da imagem aqui

Aaron
fonte
2
+1 As respostas que demonstram que a solução funciona são as melhores.
whuber
12

Uma solução possível seria criar seus buffers redondos "normais" usando a ferramenta padrão de buffer ESRI com o raio que você gostaria e, em seguida, executando um Feature Envelope To Polygon nessa classe de recurso resultante de buffers. Isso cria um recurso de envelope quadrado em torno da extensão de cada recurso. O Envelope de recurso para polígono está localizado em Gerenciamento de dados> Recursos. O modelo do construtor de modelos seria semelhante a:

insira a descrição da imagem aqui

Um alto
fonte
Excelente solução! Além disso, criando a saída do buffer como uma camada in_memory (in_memory \ tmpBuffer) e você pode evitar a gravação de dados desnecessários no disco e tornar o processo muito mais rápido.
21812 RyanDalton
9

Como o script vinculado no final do código de Aaron pode ser usado apenas para buffers quadrados e não utiliza o módulo arcpy.da mais recente, escrevi um script que pode ser usado para criar buffers retangulares. Em um conjunto de dados de 10k de pontos aleatórios, ele foi concluído em 10 segundos:

insira a descrição da imagem aqui

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)
Paulo
fonte
5

Supondo que você esteja usando ArcObjects (use as tags para especificar o idioma e a API que está usando), você pode usar IEnvelope.Expandpara criar um buffer quadrado a partir do envelope de um ponto, como neste exemplo: Obter todos os recursos da pesquisa de pontos no snippet do GeoFeatureLayer

ESRI.ArcGIS.Geometry.IEnvelope envelope = point.Envelope;
envelope.Expand(searchTolerance, searchTolerance, false);
blah238
fonte
1

Como alternativa à resposta de Aaron, para aqueles sem licença Avançada, use a ferramenta Geometria Mínima Limitada . Etapas abaixo (modificadas de Aaron):

  1. Buffer seu recurso de ponto (ArcToolbox> Ferramentas de análise> Proximidade> Buffer). Certifique-se de selecionar a distância correta na caixa Unidade linear.
  2. Insira seus buffers recém-criados na ferramenta Geometria mínima de delimitação (Ferramentas de gerenciamento de dados> Recursos> Geometria mínima de delimitação). Use 'RECTANGLE_BY_AREA' ou 'RECTANGLE_BY_WIDTH', as outras opções estão disponíveis apenas com uma licença Avançada.

EDIT : Esta opção não permite controlar a orientação dos buffers quadrados resultantes, sem usar a opção 'ENVELOPE' (que requer uma licença avançada). Ao marcar a opção 'Adicionar características geométricas como atributos à saída (opcional)' - o deslocamento resultante será registrado como 'MBG_Orientation' na classe de recurso de saída. Isso pode ser usado para girar os recursos de volta ao centro, se desejado - consulte Girando polígonos por valor na tabela de atributos usando o ArcPy? para uma solução potencial para isso.

insira a descrição da imagem aqui

Dùn Caan
fonte
Para minha classe de recurso específica, ele gira os quadrados em diferentes direções usando este fluxo de trabalho. Talvez porque eu tenha círculos de buffer sobrepostos. Não tenho certeza. Eu tinha Esri usando o método de Aaron acima na minha mesma classe de recursos e ele não girava os círculos em buffer.
Andrew
@ Andrew, sim, você está certo, isso é uma limitação da ferramenta sem uma Licença Avançada. O uso da opção ENVELOPE retornaria o mesmo resultado que o método de Aaron acima, mas também precisará de uma licença avançada. Uma solução potencial seria marcar a opção 'adicionar características geométricas como atributos', descobrir a quantidade em que elas são inclinadas (devem ser consistentes) e depois girar os buffers quadrados resultantes por essa quantidade em uma sessão de edição. Ainda não tentei isso.
Dùn Caan
0

Este site descreve como converter csv em buffers quadrados ou retangulares ou circulares usando geographiclib JavaScript e js2shapefile.

Você pode dar uma olhada se resolver o seu problema.

GeoSpatialEarth.in
fonte