Çoklu çizginin ilgili başlangıç ​​ve bitiş özelliklerine nokta kimlikleri atanıyor mu?


9

İki şekil dosyam var, Point ve Polyline. Çizgiler nerede sona başlar nokta veri kimliği (systemID) ile benim çoklu katman doldurmaya çalışıyorum; Örneğin. iki sütun oluşturun (ve arasında). Hatlara zaten atanmış akış yönü vardır. ArcHydro araçlarını kullanıyorum ama Arcpy de gayet iyi.

ArcHydro'da Nitelik Araçları> Başlangıç ​​/ Bitiş Düğümlerini satırlar için kullanmayı denedim ancak nokta verilerimden olmayan Kime ve Kimden için değerler oluşturur. Diğer alternatifim Feature to Vertices kullanmak ve sonucu sistemID almak için nokta veri tabloma katılmaktı. Ama sonra çoklu katmanı da güncellemeliydim. Eminim bunu yapmanın daha kolay bir yolu vardır.

Not: Tüm çizgilerin köşelerde noktaları yoktur, boş değerler onlar için uygundur.


Bu yüzden puanlarınız FNode, TNyl alanları çoklu satırlarda gitmesi gereken bir 'systemID' alanına sahip ...
Michael Stimson

Bu noktada bir yerde, temel özelliklerden başlayarak ve bitirmek için ayrı bir özellik sınıfı olarak bir cevabı olan bir soru var, kimlikleri almak için nokta verilerinizle ikisini (ayrı ayrı) kesişin, ardından uzamsal çizgiyi kullanarak satırlara tekrar birleştirin Kimlik ve doğru başlangıç ​​veya bitiş alanına atama (orada hesaplanan bir alan olabilir). Yine de bulamıyorum. Etrafında kazılar sırasında buldum bu bir .
Chris W

İşte şöyledir: gis.stackexchange.com/questions/85082 Ve noktalara değil, noktalara değil, noktalara Feature Vertices'ti. Sorunun sonunda hemen hemen söyledikleriniz.
Chris W

@ChrisW, FelixIP'in bu konudaki cevabını gerçekten seviyorum. Sadece iki özellik birleşimi.
Michael Stimson

Yanıtlar:


12

Bazen kutudan çözüm kullanmamak daha iyidir. Bu yüzden öneriyorum

  1. Düğüm katmanındaki X ve Y alanlarını doldurun, cm gibi tamsayılara dönüştürün. Dize alanı oluşturun ve tamsayıların dize temsillerini birleştirerek doldurun.
  2. Şekilde ilk nokta için bağlantılar tablosunda benzer bir şey yapın.
  3. En son oluşturulan alanları kullanarak bağlantılara düğümler tablosuna katılın ve düğüm numarasını FROM alanına aktarın.

Git 2, ancak TO düğüm no'yu atamak için son noktayı kullan


Beğendim! Gibi Saha hesapla şey str (yuvarlak (! Şekli! .FirstPoint.X, 3)) + "" + str (yuvarlak (! Şekli! .FirstPoint.Y, 3)) düğümden için (Python ayrıştırıcı) str (yuvarlak (! Shape! .LastPoint.X, 3)) + "," + str (round (! Shape! .LastPoint.Y, 3)) düğüme, sonra noktaya benzer (metin olarak) sonra katılın ... Acı Felix olmadan mekansal birleştirme mükemmel yolu! Coğrafi veriler için daha önemli basamaklara yuvarlayın (7 veya 8 gibi).
Michael Stimson

Elbette sözlüğün yavaş masa birleştirmesinin yerini aldığı bir komut dosyası ortamında da oldukça hızlı
FelixIP

Int (X * 100)
metrede

Yukarıda bağlantılı sorudaki yöntemden kesinlikle daha basit. Daha az adım, daha az araç ve lisans düzeyi kısıtlaması yoktur. Bir uzamsal birleşimi düzenli bir nitelik birleşimine dönüştürmek için ilginç bir fikir.
Chris W

1

Aynı şeyi birkaç ay önce yaptım. Arcpy kullandım ama senaryo burada yayınlamak için çok uzun, bu yüzden size ne yaptığımın bir özetini vereceğim.

  1. Belirli bir çizgi özelliği içinde hangi noktaların / düğümlerin olduğunu tespit etmek için bir uzamsal birleşim kullandım.

  2. Uzamsal birleşim akış yönünü hesaba katmadığından, başlangıç ​​noktası ve bitiş noktası olanı belirlemek için kavisli kullandım. I arcpy kullanarak bunu yapmak mümkün olduğunu açıklar özü işlev hattı özelliği başlama / bitiş köşeler için koordinat bilgileri ve bağlı noktaları koordinat değerleri bu karşılaştırıldı.

  3. Son olarak, orijinal çoklu satır veri kümesindeki alanları doldurmak için setValue işlevini kullandığım nokta / noktalardan hangileri olduğunu öğrendim.

Açıkçası, bundan biraz daha fazlası var ama ana noktaları özetledim.


Geometrik ağımda, akış yönü kardinal yönlerin herhangi birinde olabilir. Bir de akış yönü rasterini veya eşdeğerini kullanmadığım sürece ham koordinatların karşılaştırılmasından bir akış yönü belirleyemedim. Bu bile sorunlu olabilir, çünkü bazen borular doğal konturlara eğimlidir veya su yokuş yukarı pompalanır. Akış yönünüzün doğru olduğundan nasıl emin olabilirsiniz?
Priscilla

1

@FelixIP'den ilham aldım, ancak ağım 400K + borular ve 500K + düğümlerle oldukça büyük olduğundan, birleştirmeden veya fazladan dosya oluşturmadan bir çözüm yazmak istedim.

Geometrik ağ yapısı, düğümlerin X, Y ve boru uçlarını çakışmaya zorlar. Bu konumlara kavisli imleçlerdeki şekil belirteçleriyle erişebilir ve onları eşleştirebilirsiniz. Çizgiler için şekil belirteçleri, bir dizi köşeyi çizildikleri sırayla döndürür. Ağımda, boruların çekilme sırası büyük ölçüde KG oldu çünkü bunu akış yönlerini ayarlamak için kullanıyoruz. Böylece, ilk köşe borunun başlangıcıdır ve son köşe borunun sonu.

Referans: ASSETID = borunun kimliği, UNITID = borunun başlangıcındaki düğüm kimliği, UNITID2 = borunun ucundaki düğüm kimliği.

nodes = "mergeNodes"
pipes = "SEWER_1"

nodeDict = {}
pipeDict = {}

#populate node dictionary with X,Y as the key and node ID as the value
for node in arcpy.da.SearchCursor(nodes, ["UNITID", "SHAPE@XY"]):
    nodeDict[(node[1][0], node[1][1])] = node[0]

#populate pipe dictionary with pipe ID as the key and list of X,Y as values 
#vertices populated in the order that the line was draw
#so that [0] is the first vertex and [-1] is the final vertex
for pipe in arcpy.da.SearchCursor(pipes, ["ASSETID", "SHAPE@"]):
    for arrayOb in pipe[1]:
        for point in arrayOb:
            if pipe[0] in pipeDict:
                pipeDict[pipe[0]].append((point.X, point.Y))
            else: 
                pipeDict[pipe[0]] = [(point.X, point.Y)]

#populate UNITID with the first vertex of the line
#populate UNITID2 with the final vertex of the line
with arcpy.da.UpdateCursor(pipes, ["ASSETID", "UNITID", "UNITID2"]) as cur:
    for pipe in cur:
        if pipeDict[pipe[0]][0] in nodeDict:
            pipe[1] = nodeDict[pipeDict[pipe[0]][0]]
        if pipeDict[pipe[0]][-1] in nodeDict:
            pipe[2] = nodeDict[pipeDict[pipe[0]][-1]]
        cur.updateRow(pipe)

Bu yaptığımın% 90'ı, ancak iki kez borudan geçmiyorum, çünkü düğümler sözlüğü zaten mevcut.
FelixIP
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.