Estrarre il numero di vertici in ciascun poligono?


14

Ho ArcGIS Desktop 10.2 e la mia sfida è come estrarre il numero di vertici in ciascun poligono per tutte le funzionalità come questa:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Ho molti pacchi nella mia classe di caratteristiche e voglio estrarre il numero di vertici per tutte le caratteristiche separatamente, quindi voglio visualizzare le coordinate XY per tutti i vertici.

per ulteriori informazioni, voglio solo convertire vertici per ogni poligono e visualizzare il numero di ogni vertice a partire da 1 numero, quindi se ho un poligono e ha 4 vertici, voglio convertire un poligono in vertici e visualizzo il numero di vertici come questo (1,2,3,4,5), quindi visualizzando xy per ogni vertice, penso che il vero ID sfida in, come convertire tutti i poligoni in vertici e creare ogni numero di vertici a partire da 1 numero.


In base alla modifica, vuoi che ogni funzione abbia un ID univoco (1 .... n) per funzione e coordinate XY? Preferiresti che una colonna / campo avesse tutte queste informazioni ai fini dell'etichettatura, ad es. [1, 942744.1234, 924654.1234] [2, 952744.1234, 925654.1234] ...?
Aaron

sì, se non sbaglio, uno archiviato ha un ID per numero di vertici in ciascun poligono in questo modo (1,2,3,4), (1,2,3,4,5), (1,2,3,4, 5,6,), (1,2,3,4,5,6,7,8,9) ecc., Quindi penso che xy possa essere facile se abbiamo chiamato lo strumento Aggiungi xy da arctoolbox
GIS Man

Risposte:


5

Il codice seguente combina le altre risposte e aggiunge un po 'per numerare i vertici. risultati

import arcpy
arcpy.env.workspace = "in_memory"
#paths
fc = r"...\polygons"
fc_out = r"...\vertices"
arcpy.MakeFeatureLayer_management(fc, "lyr")
# add fields if needed
for FIELD in ["DRAW_ORDER", "COUNT"]:
    if FIELD not in [field.name for field in arcpy.ListFields(fc)]:
        try:
            arcpy.AddField_management("lyr", FIELD, "SHORT")
        except Exception as e:
            print e
# get the number of points minus overlapping (@dmahr - GSE)
arcpy.CalculateField_management("lyr", "COUNT", "!Shape!.pointCount-!Shape!.partCount", "PYTHON")
# dict to iterate and check count
OIDS = {}
for row in arcpy.da.SearchCursor("lyr", ["OBJECTID", "COUNT"]):
    OIDS[row[0]] = row[1]
del row
# get vertices as points and add XY (@Aaron - GSE)
arcpy.FeatureVerticesToPoints_management("lyr", fc_out)
arcpy.AddXY_management(fc_out)
# start adding a number to the points
for OID in OIDS:
    order_count = 1
    rows = arcpy.da.UpdateCursor(fc_out, ["DRAW_ORDER", "COUNT"], "ORIG_FID = %d"%OID)
    for row in rows:
        # will leave the overlapping as NULL
        if order_count <= OIDS[OID]:
            row[0] = order_count
            rows.updateRow(row)
            order_count += 1
##        # this can set the overlapping to 0 or some unique value (999)
##        else:
##            row[0] = 0
##            rows.updateRow(row)

I punti sono etichettati in ordine di disegno. L'ultimo punto (sotto il primo) non avrà etichetta e può essere cancellato selezionando tutti i punti che hanno valori Null o unici "DRAW_ORDER" se non necessari per la ricostruzione. È possibile utilizzare una query di definizione per rimuovere i punti sovrapposti dalla visualizzazione.

Sono presenti dati XY, ma li lascerò ai tuoi desideri di etichettatura / visualizzazione. Vedi la risposta di Aaron sull'aggiunta di un campo XY per l'etichettatura.

Stavo anche giocando con FeatureClass all'array numpy, ma ho finito prima.


grazie @ gm70560, ho seguito le tue variabili di codice e l'ho salvato come .py, ma quando voglio eseguirlo, viene visualizzato un messaggio di errore "Il nome del campo specificato non esiste nella tabella", quindi cosa posso fare ?
GIS Man

ecco una schermata di stampa dal mio PC, ho appena impostato il percorso della classe di caratteristiche di destinazione e il percorso per l'output di una nuova classe di caratteristiche, nel tuo codice, se puoi fare una guida su come usare il tuo codice, imageshack.com/i/ fvsozep
GIS Man

Non ha aggiunto il campo (?). Cosa è successo più in alto nei risultati? Ho una chat room per scaricare tutti i risultati. Lascia un commento così posso controllare la stanza.
gm70560,

22

Il modo più semplice per farlo è aggiungere un nuovo campo intero alla tabella degli attributi del livello pacchi. Quindi, eseguire il calcolatore di campo con la seguente espressione:

!Shape!.pointCount-!Shape!.partCount

Il !Shape!.pointCountrestituisce il numero totale di vertici nella funzione. Tuttavia, il primo vertice di ciascuna parte viene ripetuto alla fine, al fine di chiudere la funzione. Per gestire ciò, sottrarre un vertice per ogni parte usando -!Shape!.partCount.

Nota che dovrai usare il parser Python per far funzionare questa espressione.

Calcolatrice sul campo


questo è davvero bello, ma non fornirà l'XY per ognuno di questi vertici. Sembra che la risposta sarebbe quella di utilizzare entrambe le risposte (vale a dire, anche @ di Aaron) per ottenere tutte le informazioni richieste.
Roland

@Roland Hai ragione ... Ho perso la parte della domanda sui vertici XY. In tal caso dovrai utilizzare il SearchCursormetodo nella risposta di Aaron o uno strumento di geoprocessing come Feature Vertices To Points (sebbene questo strumento richieda una licenza ArcGIS per desktop avanzato).
Dmahr

grazie mille @dmahr, penso che manchi un passaggio, quando calcolo il valore, il risultato è il conteggio del numero di vertici, quindi se ho una classe di caratteristiche del pacco con 5 vertici voglio visualizzarlo in questo modo 1,2,3 , 4,5 su ogni vertice, non contare tutti i vertici in un numero, la vera sfida, come visualizzare il numero per ciascun vertice a partire da 1 numero per ogni pacco.
GIS Man

12

dmahr ha fornito una buona soluzione per contare i vertici. Per un modo non programmatico di etichettare ciascun punto con i cordoni XY, provare il flusso di lavoro seguente:

  1. Caratteristica Vertici a punti
  2. Aggiungi due nuovi campi (tipo: doppio) nel nuovo punto FC "X", "Y"
  3. Calcola la geometria. Campo clic destro> Calcola geometria ...> Coordinata X del punto (ripetere per il campo Y)
  4. Aggiungi un altro campo "XY" (tipo: testo)
  5. Calcola il campo "XY" nel calcolatore di campo, dove XY =

    str (! x!) + "," + str (! y!)

  6. Funzionalità dell'etichetta. Livello clic destro> Etichette> Campo etichetta: XY

Ciò produce i seguenti risultati:

inserisci qui la descrizione dell'immagine

È inoltre possibile eseguire queste azioni a livello di codice utilizzando explode_to_pointsun cursore di ricerca (come inizio).

Decostruisci una caratteristica nei suoi singoli punti o vertici. Se explode_to_points è impostato su True, una funzione multipunto con cinque punti, ad esempio, è rappresentata da cinque righe.

(Il valore predefinito è falso)

arcpy.da.SearchCursor (in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})

sembra che occorrerebbe un po 'di processo post o utilizzare la risposta di @ dmahr per ottenere un riepilogo per funzione di # di vertici.
Roland

4

Se non si desidera calcolare un nuovo campo e si desidera recuperare rapidamente un certo numero di vertici per livello (per scopi di generalizzazione, ad esempio quando si espongono i set di dati sul Web), è possibile creare uno strumento di script personalizzato all'interno di un toolbox o esporre il codice come componente aggiuntivo Python.

Codice dello strumento di script personalizzato:

import arcpy
in_fc = arcpy.GetParameterAsText(0)

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])
arcpy.AddMessage("***************************************")
arcpy.AddMessage("Number of vertices in the layer: {0}".format(count_vertices))
arcpy.AddMessage("***************************************")

Codice componente aggiuntivo Python (selezionare un livello nel sommario per contare i vertici):

import arcpy
import pythonaddins

arcpy.env.overwriteOutput = True
mxd = arcpy.mapping.MapDocument("current")
in_fc = pythonaddins.GetSelectedTOCLayerOrDataFrame()

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])

pythonaddins.MessageBox(count_vertices, 'Number of vertices in {0}'.format(in_fc.name), 0)
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.