ArcPy veya ModelBuilder kullanarak nokta konumlarını taşıma / dengeleme?


10

Metin ek açıklama özellikleri olan bir dizi coğrafi referanssız CAD katmanları ( bu soruya bakın ) var. Metni noktalara dönüştürmek için bir model oluşturdum, ancak ek açıklamayı bir Point özellik sınıfına dönüştürdükten sonra, CAD metni bağlantı noktalarının CAD metninin merkezine (noktaların ait olduğu yer) denk gelmediğini görüyorum.

Bu nedenle, sağlayacağım ölçülen bir X, Y değerini kullanarak programlı olarak (ArcPy veya ModelBuilder kullanarak) bir özelliği geçerli konumuna göre (delta x, y) [taşımak] istiyorum.

Bu, CBS noktalarını ofset CAD bağlantı noktası yerine ait oldukları yere geri taşımamı sağlayacaktır.

Bu görevi nasıl başarabilirim?


@PolyGeo SHAPE @ XY IN 10.1 kullanarak mükemmel bir cevap verdi , ama şu anda 10.0 kullanıyorum. 10.0 fikir var mı?

Yanıtlar:


17

Bu kod , ArcGIS 10.1'de arcpy.da.UpdateCursor ile gelen SHAPE @ XY jetonunu kullanarak yapmalıdır .

import arcpy
# Set some variables
fc = r"C:\temp\test.gdb\testFC"
fc2 = r"C:\temp\test.gdb\testFCcopy"
xOffset = 0.001
yOffset = 0.001
# Code to make a copy which will have its coordinates moved (and can be compared with original)
if arcpy.Exists(fc2):
    arcpy.Delete_management(fc2)
arcpy.Copy_management(fc,fc2)
# Perform the move
with arcpy.da.UpdateCursor(fc2, ["SHAPE@XY"]) as cursor:
    for row in cursor:
        cursor.updateRow([[row[0][0] + xOffset,row[0][1] + yOffset]])

Burada kullanılan kodlama modeli ArcPy Café'den geldi .


Ihh! SHAPE @ XY'nin sadece 10.1'de mevcut olduğunu ve şirketimin hala 10.0 kullandığını fark etmem bu sabaha kadar sürdü . Bu harika bir cevap (ileri gidiyor), ama bekleyip kimsenin 10.0 için herhangi bir öneri olup olmadığını göreceğim. Teşekkürler!
RyanKDalton

Bunu okuyan herkes için benzer bir süreç hakkında daha fazla bilgi. Hala 10.1. arcpy.wordpress.com/2013/06/07/disperse-overlapping-points
theJones

Bu aslında değerleri herhangi bir yerde mi ayarlıyor? UpdateCursor'ı daha önce hiç böyle kullanmamıştım. Genellikle + = yaparım ve satırı güncellerim. Aksi takdirde sürümümde farklı yaptığım şey, UpdateCursor'ın ['SHAPE @ X', 'SHAPE @ Y'] kullanmasıdır, böylece satır [0] yerine satır [0] ve satır [1] olarak erişebilirsiniz. ] [0] ve satır [0] [1]. Benim için okuması biraz daha kolay.
eseglem

Evet, bu satırları güncellemenin geçerli bir yoludur. Aslında, birkaç hafta öncesine kadar updateRow () içinde hiç bir değer geçirmemiştim. Aslında geometriyi güncellemek için bir örnekti.
Paul

Cevabınız için çok teşekkürler PolyGeo! Aslında kod değişiklik olmadan çalıştı oldukça etkilendim. ArcGIS Desktop 10.6 kullanıyorum
Rie Mino

8

Beni son çözümüme yönlendirdiğim için @ artwork21'e borçluyum. Aslında 10.0 çevrimiçi yardım makalesi "olarak adlandırılan ArcGIS neredeyse tam bir senaryonubulmuş hesaplama alan örnekler, alt kategori" başlığı altında listelenen, " Kod örnekleri geometri " "ve x 100 ile her bir noktanın koordinat kayması, bir nokta özelliği sınıfı için "

ModelBuilder "Alanı Hesapla" aracında kullandığım son komut dosyası:

İfade:

shiftXYCoordinates(!SHAPE!,%ShiftX%,%ShiftY%)

burada ShiftX ve ShiftY , ModelBuilder tuvalinde tanımlanan değişkenlerdir (parametre olarak).

İfade Türü:

PYTHON_9.3

Kod Bloğu:

def shiftXYCoordinates(shape,x_shift,y_shift):
   point = shape.getPart(0)
   point.X += float(x_shift)
   point.Y += float(y_shift)
   return point

Tüm modeller seçilen bir sette çalıştığından, bunu diğer model oluşturucu oturumlarındaki diğer modellerle / araçlarla birlikte çalışacak genel bir araç olarak da oluşturabilmelisiniz. Oluşturduğum çok basit model (koordinat değerlerini değiştirmek için diğer modellere "eklenti" olarak) şöyle görünür. Bu şekilde (diğer modellerde tanımlandığı gibi) vardiyayı seçim başına bazda kontrol edebilirim:

ShiftXY Modeli

Bir cazibe gibi çalıştı, girişiniz için hepinize teşekkür ederim!


özelliği sütunda depolanan tablo içindeki değere göre kaydırmak mümkün mü?
Losbaltica

1
Olmalı. ShiftX ve ShiftY parametrelerini uygun sütunlara atamanız yeterlidir.
RyanKDalton

Buraya "şekil" olarak geçtiğiniz şeyle kafam karıştı. Bana yardım edebilir misin lütfen?
jbchurchill

"İfade", shiftXYCoordinates () adlı kod bloğu işlevine iletilen parametreleri gösterir. İlk parametre, katmandaki şekil alanı olan! SHAPE!
RyanKDalton

5

Özellik alanlarını taşımak için bu alan hesaplayıcı komut dosyasını da kullanabilirsiniz :

def XYsetVALUE( shape, X_value, Y_value): 
  myMoveX = 0.001
  myMoveY = 0.001
  point = shape.getPart(0) 
  point.X = X_value + myMoveX
  point.Y = Y_value + myMoveY
  return point 

XYsetVALUE (! ŞEKİL !,! X_COORD !,! Y_COORD!)

Yukarıdaki işlevi kullanarak modelinize fazladan bir Alan Hesaplama yöntemi ekleyebilirsiniz.


Bunu yapmanın ilginç bir yolu, aslında şekil alanında alan hesaplayabileceğinizi bilmiyordum. Bu, tüm noktalar için ayarlanmış bir ofset ise, bunu yapmanın en kolay yolu olabilir. Muhtemelen X ve Y koordinatlarını iletmek yerine point.X + = myMoveX ve point.Y + = myMoveY yapmak daha hızlı olurdu.
eseglem

5

Noktası belirli bir yöne (açı) ve belirli bir mesafeye taşımak / kaydırmak için çözümü uyarladım.

Görünüşe göre:

def shiftXYCoordinates(shape,angle,distance):
point = shape.getPart(0)
point.Y += distance * math.cos(math.radians(angle))
point.X += distance * math.sin(math.radians(angle))
return point

ve pointXYCoordinates (! SHAPE !,! Angle!, 5000) gibi denebilir, eğer puan özellikleriniz için bir alan “açısı” varsa (veya sabit bir şekilde). Açı ondalık derece olarak verilmelidir. 0 “yukarı”, 90 “sağ” vb.

Ayrıca çalıştırmadan önce Alan Adı “Şekil” i seçtiğinizden emin olun :)

(Çözelti ArcMap 10.0 SP5'te test edilmiştir)


4

Gördüğünüz gibi, imleç belirteçlerine eriştiğinizde 10.1'de çok daha kolay.

import arcpy
# Code to move features in copy of same dataset
fc = r"C:\temp\test.gdb\testFC"
fc2 = r"C:\temp\test.gdb\testFCcopy"
xOffset = 0.001
yOffset = 0.001
if arcpy.Exists(fc2):
    arcpy.Delete_management(fc2)
arcpy.Copy_management(fc, fc2)

shape = arcpy.Describe(fc2).ShapeFieldName

cursor = arcpy.UpdateCursor(fc2)
for row in cursor:    
    point = row.getValue(shape).getPart()
    row.setValue(shape, arcpy.Point(point.X + xOffset, point.Y + yOffset))
    cursor.updateRow(row) 

del point, row, cursor

2

Bu 10.0 için geçerlidir:

# Featureclass here
FC = r'featureclass'

fcount = 0
shapefield = arcpy.Describe(FC).shapeFieldName
featureUpdate = arcpy.UpdateCursor(FC)
for f in featureUpdate:
    # Hard coded shifts but easy enough to set up a lookup function if needed
    sLon = 0.001
    sLat = 0.001
    # Optional but I like to count to see where it is at in the process
    if fcount % 1000 == 0:
        print('Updating feature %s...' %(fcount))
    # Get the original value
    cF = f.getValue(shapefield)
    cPNT = cF.getPart()
    # Create a new point with the shifted value
    sPNT = arcpy.Point(cPNT.X - sLon, cPNT.Y - sLAT)
    # Set the shapefield to the new point and update feature
    f.setValue(shapefield, sPNT)
    featureUpdate.updateRow(f)
    fcount += 1
del featureUpdate
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.