Her çokgendeki köşe sayısı çıkartılıyor mu?


14

ArcGIS Desktop 10.2 var ve benim meydan okuma nasıl böyle tüm özellikler için her çokgen sayı köşeleri ayıklamak için:

resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Özellik sınıfımda birçok parsel var ve tüm özellikler için köşe sayısını ayrı ayrı ayıklamak istiyorum, sonra tüm köşeler için XY koordinatlarını görüntülemek istiyorum.

daha fazla bilgi için, ben sadece her poligon için köşeleri dönüştürmek istiyorum ve her sayı köşeleri 1 sayıdan bakıldığında, bu yüzden çokgen varsa ve 4 köşeleri varsa, çokgeni köşelere dönüştürmek istiyorum ben böyle köşeleri sayısını görüntülemek (1,2,3,4,5), daha sonra her köşeler için xy gösteriliyor, bence asıl meydan okuma kimliği, tüm poligonu köşelere dönüştürmek ve 1 sayısından başlayarak her köşe sayısını yapmak.


Düzenlemenize bağlı olarak, her özelliğin her özellik için benzersiz bir kimliğe (1 .... n) ve XY koordinatlarına sahip olmasını ister misiniz? Bir sütun / alanın etiketleme amacıyla tüm bu bilgilere sahip olmasını ister misiniz, örneğin [1, 942744.1234, 924654.1234] [2, 952744.1234, 925654.1234] ...?
Aaron

evet, yanlış değilse, dosyalananların her biri çokgen gibi köşeler için bir kimliğe sahiptir (1,2,3,4), (1,2,3,4,5), (1,2,3,4, 5,6,), (1,2,3,4,5,6,7,8,9) vs, o zaman arctoolbox'tan xy aracı eklemeyi denirsek xy'nin kolay olabileceğini düşünüyorum
GIS Man

Yanıtlar:


5

Aşağıdaki kod diğer cevapları birleştirir ve köşeleri numaralandırmak için biraz ekler. Sonuçlar

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)

Noktalar çizim sırasına göre etiketlenir. Son noktanın (ilkinin altında) hiçbir etiketi olmaz ve yeniden oluşturma için gerekli değilse Null veya benzersiz "DRAW_ORDER" değerlerine sahip tüm noktalar seçilerek silinebilir. Çakışan noktaları ekrandan kaldırmak için bir tanım sorgusu kullanılabilir.

XY verileri var, ancak bunu etiketleme / görüntüleme arzularınıza bırakacağım. Etiketleme için XY alanı ekleme hakkındaki Aaron'un cevabına bakın.

Ben de numpy dizi FeatureClass ile oynuyor, ama önce bu bitirdi.


teşekkür ederim @ gm70560, ben kod değişkenlerinizi izledim ve .py kaydedin, ama ben yürütmek istediğinizde, bir hata iletisi görünür, "Belirtilen alan adı tablo içinde yok", bu yüzden ne yapabilirim ?
CBS Adam

Burada bir baskı ekranı formu benim pc, ben sadece hedef özellik sınıfı yol ve çıkış yeni özellik sınıfı için yol, kodunuzu, eğer kodunuzu kullanmak için bir rehber yapabilirsiniz eğer, imageshack.com/i/ fvsozep
CBS Adam

Alanı eklemedi (?). Sonuçlarda daha ne oldu? Tüm sonuçları dökmek için bir sohbet odam var . Ben oda kontrol böylece bir yorum bırakın.
gm70560

22

Bunu yapmanın en kolay yolu, parsel katmanının nitelik tablosuna yeni bir tamsayı alanı eklemektir. Ardından, alan hesaplayıcısını aşağıdaki ifadeyle çalıştırın:

!Shape!.pointCount-!Shape!.partCount

!Shape!.pointCountÖzelliğindeki köşe toplam sayısını döndürür. Ancak, her parçanın ilk tepe noktası, özelliği kapatmak için sonunda tekrarlanır. Bunu yapmak için, kullanarak her parça için bir tepe noktası çıkarın -!Shape!.partCount.

Bu ifadenin çalışması için Python ayrıştırıcısını kullanmanız gerekeceğini unutmayın.

Alan hesaplayıcısı


bu gerçekten harika, ama bu köşelerin her biri için XY'yi sağlamayacak. Cevabın, istenen tüm bilgileri almak için her iki yanıtı da (yani @ Aaron's) kullanmak olduğu anlaşılıyor.
Roland

@Roland Haklısın ... XY köşeleri hakkındaki sorunun bir kısmını kaçırdım. Bu durumda, SearchCursoryöntemi Aaron'un yanıtında veya Özellik Noktaları Noktalar gibi bir coğrafi işleme aracında kullanmanız gerekir (ancak bu araç için bir ArcGIS for Desktop Advanced lisansı gerekir).
dmahr

@dmahr çok teşekkür ederim, ben bir adım eksik olduğunu düşünüyorum, ben değer hesaplamak zaman sonuç köşe sayısı sayısı, yani 5 köşeli parsel özellik sınıfı varsa ben bu 1,2,3 gibi görüntülemek istiyorum , Her köşede 4,5, bir sayıdaki tüm köşeleri saymaz, gerçek meydan okuma, her bir parsel için 1 sayıdan başlayarak her köşe için sayının nasıl görüntüleneceğini gösterir.
CBS Adamı

12

dmahr köşeleri saymak için iyi bir çözüm sağladı. Her noktayı XY koordinatlarıyla etiketlemenin programlı olmayan bir yolu için aşağıdaki iş akışını deneyin:

  1. Noktalardan Noktalara Özellik
  2. FC "X", "Y" yeni noktasına iki yeni alan (tür: çift) ekleyin
  3. Geometriyi hesaplayın. Sağ tıklama alanı> Geometri Hesapla ...> X Nokta Koordinatı (Y alanı için tekrarla)
  4. Başka bir alan "XY" ekleyin (tür: Metin)
  5. Alan hesap makinesinde "XY" alanını hesaplayın, burada XY =

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

  6. Etiket özellikleri. Sağ tıklama katmanı> Etiketler> Etiket Alanı: XY

Bu, aşağıdaki sonuçları üretir:

resim açıklamasını buraya girin

Bu eylemleri explode_to_pointsbir arama imleciyle (başlangıç ​​olarak) kullanarak programlı olarak da gerçekleştirebilirsiniz .

Bir özelliği tek tek noktalarına veya köşelerine ayırın. Explode_to_points öğesi True olarak ayarlanırsa, örneğin beş noktalı çok noktalı bir özellik beş satırla temsil edilir.

(Varsayılan değer Yanlış'tır)

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

bir post post prosese ihtiyaç duyulacağı veya # dmahr'un cevabını köşe sayısı # özellik başına toplamı almak için kullanacağı görülüyor.
Roland

4

Yeni bir alan hesaplamak istemiyor ve katman başına çok sayıda köşeyi gerçekten hızlı bir şekilde geri almak istiyorsanız (web üzerindeki veri kümelerini açığa çıkarmak gibi genelleme amacıyla), araç kutusu veya kodu Python eklentisi olarak gösterme.

Özel komut dosyası araç kodu:

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

Python eklenti kodu (köşeleri saymak için İçindekiler'de bir katman seçin):

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.