Como dividir pontos por polígono usando o ArcGIS Desktop?

8

Estou procurando uma maneira de dividir pontos por uma classe de recurso de polígono do condado. A imagem anexada mostra duas classes de recurso: uma composta por pontos e a outra uma classe de recurso de polígono do município. A ferramenta de divisão seria ideal se permitisse pontos. Eu preferiria uma saída limpa sem campos adicionais adicionados aos atributos de ponto. Além disso, gostaria de ter o nome do condado da classe de recurso de polígono que define as novas classes de recurso de ponto (por exemplo, Kiowa, Clark, Comanche). Agradeço quaisquer soluções e conselhos.

Neste exemplo, o produto final deve ser de três classes de feições pontuais denominadas "Kiowa", "Clark" e "Comanche", produzidas a partir de uma classe de feições pontuais maior. Uma solução automatizada seria ideal, pois tenho muitos FCs de pontos mesclados em dezenas de municípios para trabalhar (abrangendo aproximadamente o estado de KS).

insira a descrição da imagem aqui

Aaron
fonte
3
Essa operação é conhecida pelos usuários de software ESRI como uma junção espacial . Consulte também gis.stackexchange.com/questions/11047 e gis.stackexchange.com/questions/23398 .
whuber
@whuber Eu imagino pelo menos 5 etapas com a abordagem de junção espacial: 1) junção espacial 2) selecione pontos com base no município 3) crie novos FCs com base na seleção, 4) Renomeie FCs com base no condado 5) Exclua novos campos (por exemplo, "Join_count "). Preciso encontrar uma maneira de automatizar o processo (um de seus links é promissor). Eu também esperava que estivesse ignorando uma abordagem mais simples, semelhante ao que a "divisão" realizará para as classes de recursos de polígono. Receio ter que seguir a rota do cursor.
Aaron
Qual é o caminho para a língua francesa?
Aaron, seu comentário não corresponde à sua pergunta. A pergunta não parece indicar que você deseja um FC de saída para cada município. As outras etapas são desnecessárias: de uma vez por todas, crie uma cópia do FC do condado cujo único atributo seja um nome de condado. A junção espacial aos seus pontos termina o trabalho. Se você mesclou primeiro todos os conjuntos de dados de pontos (que é um design de banco de dados inteligente em geral), todo o seu projeto pode ser concluído em apenas duas etapas: (1) junção espacial (2) divida a saída pelo nome do município: veja a resposta de blah238.
whuber
@KhalilouWAGUE o ponto de articulação espacial en fr help.arcgis.com/fr/arcgisdesktop/10.0/help/index.html#//…
geogeek

Respostas:

4

Depois de usar Junção espacial ou Intersecção para obter o atributo Nome do condado em cada ponto, tente usar a ferramenta Camada dividida por atributos de Dan Patterson, disponível na Galeria de ferramentas de script e modelo de geoprocessamento .

Como alternativa, você pode usar o ModelBuilder para automatizar isso usando uma abordagem diferente envolvendo Selecionar camada por local (clique na miniatura para obter uma imagem completa).

insira a descrição da imagem aqui

Retirado desse segmento nos fóruns da ESRI: Seleção em lote por local e exportação de shapefiles

blah238
fonte
3

Muito mais fácil de usar o comando intersect.
Desative os campos indesejados.
1. Cruze para uma nova saída.
2. Junte a saída com o oid original.
3. Calcule um novo campo com o nome cnty.

Confira o ettools para obter algumas versões aprimoradas de junção espacial e divida por local.

Brad Nesom
fonte
2

Pelo que li, eu executaria uma sobreposição (ArcToolbox Analysis Tools - Overlay - e Identity, Intersect ou Spatial Join) de seus pontos com um conjunto de dados de polígonos do condado. No ArcMap, você poderia limitar os campos exibidos na camada do condado ao campo com o nome do condado, e somente esse campo seria adicionado ao resultado. Se mesmo esse campo adicionado for muito grande, calcule seus valores no campo correspondente na tabela de pontos e exclua o campo adicionado.

johns
fonte
2

Usando Python, você pode fazer um loop em "Select Layer By Location" para pegar os pontos que se sobrepõem a cada país e salvá-lo como um Shapefile. Seria algo como isto:

import arcgisscripting
# starts geoprocessing
gp = arcgisscripting.create()
gp.OverWriteOutput = 1

# Variable iniciation
points = u"Path for your point shape"
counties = u"Path for counties shape"
outDir = u"path for output directory"

#Load points as a layer
gp.MakeFeatureLayer(points, "points")

# Go county by county
rows = gp.searchcursor(counties)
row = rows.next()

# loop County by county overlap
while row.countyName: #adapt to your countie table of attributes
    # Make a layer from the feature class
    gp.MakeFeatureLayer(counties, "counties lyr", "[countieName]='" + row.countieName + "'")
    # Select all points that intersect the current countie polygon
    gp.SelectLayerByLocation(points, "intersect", "counties_lyr", 0, "new_selection")
    outSHP = outDir + row.counties + u".shp"
    gp.CopyFeatures_management(points, outSHP)
    print(outSHP)
    row = rows.next()
 # End of loop

 del rows, row, gp

 #END

Eu não testei, você provavelmente precisa adaptá-lo ao seu caso.

Edit: Alterado Select_analysis por CopyFeatures_management seguindo @ blah238 conselhos.

Alexandre Neto
fonte
1
Eu provavelmente mudaria Select_analysis para CopyFeatures_management ou similar - você já está fazendo a seleção, portanto ela é redundante.
precisa saber é o seguinte
Você está correto, embora o resultado seja o mesmo, editei-o para torná-lo mais claro.
Alexandre Neto
Obrigado por este script. Existe uma maneira de fazer isso fora da memória local? O problema que encontro com meus conjuntos de dados é que 7,5 milhões de pontos não gostam de ser adicionados como uma camada.
Aaron
Você adicionará como camada apenas uma parte dos pontos (de cada município). Ao executar o script fora do ArcMap, você nem precisará exibi-los para que funcione de qualquer maneira. Mas você pode tentar outra coisa. Comece criando um espaço (ou interseção) entre os pontos e polígonos; isso criará um arquivo temporário com as informações do ponto + o nome do município. Em seguida, você faz um loop nos condados e usa a Select_analysis (SpatialJoint_temp, outSHP, "[countieName] = '" + row.countieName + "'"). Acho que também funcionará, mas não sei se é mais ou menos eficiente que a primeira solução.
Alexandre Neto
0

Agora existe um tutorial em vídeo do eLearning (não gratuito, mas relativamente barato) chamado Usando os Cursores do ArcPy para Dividir por Atributo e Local que inclui mostrar como:

Escreva um script Python para dividir uma classe de recurso usando uma classe de recurso de polígono em uma classe de recurso por recursos encontrados em cada um de seus locais de polígono

Eu acho que aborda os requisitos desta pergunta.

Isenção de responsabilidade : sou o autor e o apresentador deste tutorial em vídeo do eLearning

PolyGeo
fonte