Переміщення / зміщення точок розташування за допомогою ArcPy або ModelBuilder?


10

У мене є декілька шарів CAD, що не є геореференційними (див. Це питання ), які мають функції анотації тексту. Я створив модель для перетворення тексту в пункти, але після перетворення анотації в клас класових точок я бачу, що точки прив’язки тексту CAD не збігаються з центром тексту CAD (до якого належать точки).

Тому я хотів би програматично (за допомогою ArcPy або ModelBuilder) [перемістити] функцію відносно її поточного розташування (дельта x, y), використовуючи виміряне значення X, Y, яке я надаю.

Це дозволить мені перемістити точки GIS туди, куди вони належать, замість зсувної точки прив’язки CAD.

Як я можу виконати це завдання?


@PolyGeo дав чудову відповідь за допомогою SHAPE @ XY IN 10.1, але наразі я працюю 10.0. Будь-які ідеї 10.0?

Відповіді:


17

Цей код повинен робити це за допомогою маркера SHAPE @ XY, який постачався з arcpy.da.UpdateCursor в ArcGIS 10.1.

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

Використовувана тут схема кодування походить від ArcPy Café .


Тьфу! Мені потрібно було до цього ранку зрозуміти, що SHAPE @ XY доступний лише в 10.1, а моя компанія все ще використовує 10.0. Це відмінна відповідь (рухаюся вперед), але я зачекаю і побачу, чи є хтось із пропозицій щодо 10.0. Дякую!
RyanKDalton

Більше інформації про подібний процес для тих, хто читає це. Ще 10.1. arcpy.wordpress.com/2013/06/07/disperse-overlapping-points
theJones

Це насправді десь встановлення значень? Ніколи раніше не використовував UpdateCursor. Зазвичай я роблю + = і потім оновлюю рядок. Інакше у моїй версії я відрізняюсь лише тим, що UpdateCursor використовує ['SHAPE @ X', 'SHAPE @ Y'], тому ви можете отримати доступ до них як рядок [0] і рядок [1], а не робити рядки [0 ] [0] і рядок [0] [1]. Думаю, що це просто трохи простіше для мене читати.
eseglem

Так, це правильний спосіб оновлення рядків. Насправді я ніколи не бачив значення, переданого в updateRow (), кілька тижнів тому. Насправді це був приклад оновлення геометрії.
Поль

Дуже дякую за вашу відповідь PolyGeo! Мене насправді дуже вразило, що код працює без змін. Я запускаю ArcGIS Desktop 10.6
Rie Mino

8

Я вдячний @ artwork21 за те, що він підвів мене до остаточного рішення. Насправді я знайшов майже повний сценарій в онлайн-довідковій статті ArcGIS 10.0 під назвою " Обчислити приклади поля ", переліченій під підкатегоріями " Зразки коду - геометрія " та " Для класового означення точки змістіть координату x кожної точки на 100 "

Остаточним сценарієм, який я використовував у інструменті ModelBuilder "Обчислити поле", був:

Вираз:

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

де ShiftX і ShiftY - змінні (як параметри), визначені на полотні ModelBuilder.

Тип виразу:

PYTHON_9.3

Блок коду:

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

Оскільки всі моделі працюють на вибраному наборі, ви також маєте змогу створити це як загальний інструмент, який буде працювати спільно з іншими моделями / інструментами в інших сесіях конструктора моделей. Дуже проста модель, яку я створив (як "плагін" для інших моделей для зміщення значень координат) виглядає приблизно так. Таким чином я можу контролювати зсув на основі набору за вибором (як визначено в інших моделях):

Модель ShiftXY

Це спрацювало як шарм, дякую всім за ваш внесок!


чи можливо змістити функцію на значення всередині таблиці, що зберігається у стовпці?
Лосбалтіка

1
Вона повинна бути. Просто призначте параметри ShiftX і ShiftY відповідним стовпцям.
RyanKDalton

Мене бентежить те, що ти тут передаєш як "форму". Чи можете ви мені допомогти?
jbchurchill

"Вираз" показує параметри, які передаються у функцію блоку коду під назвою shiftXYCoordinate (). Отже, першим параметром є! SHAPE !, це поле форми з шару.
RyanKDalton

5

Ви також можете використовувати цей сценарій калькулятора поля для переміщення розташувань функцій:

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 (! SHAPE !,! X_COORD !,! Y_COORD!)

Ви можете включити додатковий метод обчислення поля у вашу модель, використовуючи функцію вище.


Це цікавий спосіб це зробити, я насправді не знав, що ви можете обчислити поле на полі фігури. Насправді це може бути найпростіший спосіб зробити це, якщо це встановлений зсув для всіх точок. Напевно, було б швидше зробити пункт.X + = myMoveX і point.Y + = myMoveY, а не потрібно передавати для нього координати X і Y.
eseglem

5

Я адаптував рішення для переміщення / зсуву точки в певному напрямку (куті) та заданій відстані.

Виглядає як:

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

і називатись як shiftXYCoordinate (! SHAPE !,! Angle!, 5000), якщо у вас є поле "кут" для ваших особливостей точок (або з константою звичайно). Кут повинен бути заданий у десяткових градусах. 0 зміститься "вгору", 90 "вправо" і т. Д. Я отримав їх після створення функцій індексу смужкової карти та перетворення їх у точки.

Також переконайтесь, що перед запуском виберіть ім'я поля "Форма" :)

(Розчин випробуваний в ArcMap 10.0 SP5)


4

Як бачите, у 10.1 набагато простіше, коли ви отримуєте доступ до лексем курсорів.

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

Це працює для 10.0:

# 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.