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.


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.


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


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})

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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.