Wydobywanie liczby wierzchołków w każdym wielokącie?

14

Mam ArcGIS Desktop 10.2, a moim wyzwaniem jest wyodrębnienie liczby wierzchołków w każdym wielokącie dla wszystkich takich funkcji:

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Mam wiele działek w mojej klasie obiektów i chcę osobno wyodrębnić liczbę wierzchołków dla wszystkich obiektów, a następnie chcę wyświetlić współrzędne XY dla wszystkich wierzchołków.

aby uzyskać więcej informacji, chcę tylko przekonwertować wierzchołki dla każdego wielokąta i wyświetlić liczbę każdego wierzchołka zaczynającego się od 1 liczby, więc jeśli mam wielokąt i ma on 4 wierzchołki, chcę przekonwertować wielokąt na wierzchołki i wyświetlić liczbę takich wierzchołków (1,2,3,4,5), a następnie wyświetlając xy dla każdego wierzchołka, myślę, że prawdziwym wyzwaniem jest id, jak przekonwertować cały wielokąt na wierzchołki i ustawić każdą liczbę wierzchołków zaczynając od 1 liczby.

GIS Man
źródło
Czy na podstawie dokonanej przez Ciebie edycji chcesz, aby każda funkcja miała unikalny identyfikator (1 .... n) na funkcję i współrzędne XY? Czy wolisz, aby jedna kolumna / pole zawierała wszystkie te informacje do celów etykietowania, np. [1, 942744.1234, 924654.1234] [2, 952744.1234, 925654.1234] ...?
Aaron
tak, jeśli nie pomyłka, jedno pole ma identyfikator liczby wierzchołków każdego wielokąta w ten sposób (1,2,3,4), (1,2,3,4,5), (1,2,3,4, 5,6,), (1,2,3,4,5,6,7,8,9) itd., Więc myślę, że xy może być łatwe, jeśli nazwiemy narzędzie add xy z arctoolbox
GIS Man

Odpowiedzi:

5

Poniższy kod łączy inne odpowiedzi i dodaje trochę, aby numerować wierzchołki. wyniki

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)

Punkty są oznaczone w kolejności rysowania. Ostatni punkt (pod pierwszym) nie będzie miał etykiety i można go usunąć, wybierając wszystkie punkty, które mają wartość Null lub unikalne wartości „DRAW_ORDER”, jeśli nie są potrzebne do rekonstrukcji. Zapytania dotyczącego definicji można użyć do usunięcia nakładających się punktów z ekranu.

Dane XY są obecne, ale pozostawię to twoim pragnieniom w zakresie etykietowania / wyświetlania. Zobacz odpowiedź Aarona na temat dodania pola XY do etykietowania.

Bawiłem się także FeatureClass na tablicę numpy, ale ukończyłem to jako pierwsze.

gm70560
źródło
dziękuję @ gm70560, śledziłem zmienne kodu i zapisuję go jako .py, ale kiedy chcę go wykonać, pojawia się komunikat o błędzie „Podana nazwa pola nie istnieje w tabeli”, więc co mogę zrobić ?
GIS Man
oto ekran drukowania z mojego komputera, właśnie ustawiłem docelową ścieżkę klasy funkcji i ścieżkę wyjścia nowej klasy funkcji, w twoim kodzie, jeśli możesz podać wytyczne dotyczące korzystania z kodu, imageshack.com/i/ fvsozep
GIS Man
Nie dodał pola (?). Co stało się dalej w wynikach? Mam pokój rozmów, aby zrzucić wszystkie wyniki. Zostaw komentarz, żebym mógł sprawdzić pokój.
gm70560
22

Najłatwiej to zrobić, dodając nowe pole liczb całkowitych do tabeli atrybutów warstwy działek. Następnie uruchom kalkulator pola z następującym wyrażeniem:

!Shape!.pointCount-!Shape!.partCount

!Shape!.pointCountZwraca łączną liczbę wierzchołków w filmie. Jednak pierwszy wierzchołek każdej części jest powtarzany na końcu, aby zamknąć operację. Aby to obsłużyć, odejmij jeden wierzchołek dla każdej używanej części -!Shape!.partCount.

Zauważ, że będziesz musiał użyć parsera Python, aby to wyrażenie działało.

Kalkulator polowy

dmahr
źródło
to jest naprawdę całkiem fajne, ale nie zapewni XY dla każdego z tych wierzchołków. Wydaje się, że odpowiedzią byłoby użycie obu odpowiedzi (tj. Również @ Aarona), aby uzyskać wszystkie wymagane informacje.
Roland
@Roland Masz rację ... Brakowało mi części pytania dotyczącego wierzchołków XY. W takim przypadku musisz użyć SearchCursormetody z odpowiedzi Aarona lub narzędzia geoprzetwarzania, takiego jak Feature Vertices To Points (chociaż to narzędzie wymaga licencji ArcGIS na komputer Advanced).
dmahr
dziękuję bardzo @dmahr, myślę, że brakuje kroku, gdy obliczam wartość, wynikiem jest policzenie liczby wierzchołków, więc jeśli mam klasę działek z 5 wierzchołkami, chcę ją wyświetlić w ten sposób 1,2,3 , 4,5 na każdym wierzchołku, nie zliczaj wszystkich wierzchołków w jednej liczbie, prawdziwe wyzwanie, jak wyświetlić liczbę dla każdego wierzchołka, zaczynając od 1 liczby dla każdej działki.
GIS Man
12

dmahr zapewnił dobre rozwiązanie do zliczania wierzchołków. Aby nieprogramowo oznaczyć każdy punkt współrzędnymi XY, wypróbuj następujący przepływ pracy:

  1. Uwzględnij wierzchołki punktów
  2. Dodaj dwa nowe pola (wpisz: podwójne) w nowym punkcie FC „X”, „Y”
  3. Oblicz geometrię. Kliknij prawym przyciskiem myszy pole> Oblicz geometrię ...> Współrzędna X punktu (powtórz dla pola Y)
  4. Dodaj kolejne pole „XY” (wpisz: Tekst)
  5. Oblicz pole „XY” w kalkulatorze pola, gdzie XY =

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

  6. Funkcje etykiet. Kliknij warstwę prawym przyciskiem myszy> Etykiety> Pole etykiety: XY

Daje to następujące wyniki:

wprowadź opis zdjęcia tutaj

Można również wykonać te czynności programowo korzystając explode_to_pointsz kursora wyszukiwania (jako start).

Zdekonstruuj obiekt na poszczególne punkty lub wierzchołki. Jeśli explode_to_points jest ustawiony na True, na przykład funkcja wielopunktowa z pięcioma punktami jest reprezentowana przez pięć rzędów.

(Wartość domyślna to False)

arcpy.da.SearchCursor (in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})
Aaron
źródło
wygląda na to, że trzeba by trochę postprocesu lub użyć odpowiedzi @ dmahr, aby uzyskać podsumowanie liczby wierzchołków dla poszczególnych funkcji.
Roland
4

Jeśli nie chcemy obliczać nowego pola i chcemy bardzo szybko odzyskać liczbę wierzchołków na warstwę (do celów uogólnienia, takich jak ujawnianie zestawów danych w Internecie), możliwe jest utworzenie niestandardowego narzędzia skryptowego wewnątrz Przybornik lub ujawnij kod jako dodatek do Pythona.

Niestandardowy kod narzędzia skryptu:

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("***************************************")

Dodatkowy kod Python (wybierz warstwę w spisie treści, aby policzyć wierzchołki):

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)
Alex Tereshenkov
źródło