ArcPy या ModelBuilder का उपयोग करके पॉइंट लोकेशन मूविंग / ऑफसेटिंग?


10

मेरे पास एक नंबर गैर-भू-संदर्भित सीएडी परतें हैं ( इस प्रश्न को देखें ) जिसमें पाठ एनोटेशन विशेषताएं हैं। मैंने पाठ को बिंदुओं में परिवर्तित करने के लिए एक मॉडल बनाया है, लेकिन एनोटेशन को प्वाइंट फीचरक्लास में परिवर्तित करने के बाद, मैं देखता हूं कि सीएडी पाठ लंगर बिंदु सीएडी पाठ के केंद्र के साथ मेल नहीं खाते (जो कि बिंदु जहां हैं)।

इसलिए, मैं प्रोग्रामिक रूप से (ArcPy या ModelBuilder का उपयोग करके) [चाल] एक विशेषता को अपने वर्तमान स्थान (डेल्टा x, y) के सापेक्ष मापा X, Y मान जो मैं प्रदान करूंगा का उपयोग करूंगा।

यह मुझे ऑफ़सेट CAD एंकर पॉइंट के बजाय GIS पॉइंट्स को वापस उसी स्थान पर ले जाने की अनुमति देता है जहाँ वे हैं।

मैं इस कार्य को कैसे पूरा कर सकता हूं?


@PolyGeo ने SHAPE @ XY IN 10.1 का उपयोग करके एक उत्कृष्ट उत्तर दिया , लेकिन वर्तमान में मैं 10.0 चला रहा हूं। कोई 10.0 विचार?

जवाबों:


17

इस कोड को आर्कजी 10.1 में आर्कपीडा.यूपीडेटाकोरसॉर के साथ आए SHAPE @ XY टोकन का उपयोग करना चाहिए ।

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

यहां इस्तेमाल किया जाने वाला कोडिंग पैटर्न आर्कपी कैफे से आया है ।


ओह! यह मुझे आज सुबह तक महसूस हुआ कि SHAPE @ XY केवल 10.1 में उपलब्ध है, और मेरी कंपनी अभी भी 10.0 का उपयोग कर रही है। यह एक शानदार उत्तर है (आगे जा रहा है), लेकिन मैं प्रतीक्षा करने जा रहा हूं और देखूंगा कि किसी के पास 10.0 का कोई सुझाव है या नहीं। धन्यवाद!
रायनकेडल्टन

इसे पढ़ने वाले किसी भी व्यक्ति के लिए एक समान प्रक्रिया पर अधिक जानकारी। अभी भी 10.1। arcpy.wordpress.com/2013/06/07/disperse-overlapping-points
theJones

क्या यह वास्तव में कहीं भी मूल्यों को स्थापित कर रहा है? इससे पहले कभी भी UpdateCursor का इस्तेमाल नहीं किया। आमतौर पर मैं + = करता हूं और फिर पंक्ति को अपडेट करता हूं। अन्यथा केवल एक चीज जो मैं अपने संस्करण में अलग-अलग करता हूं, वह है अपडेटकॉरसर ['शेप @ एक्स', 'शेप @ वाई ’] का उपयोग करता है ताकि आप उन्हें पंक्ति [०] और पंक्ति [१] के रूप में उपयोग कर सकें। ] [०] और पंक्ति [०] [१]। मेरे लिए पढ़ने के लिए इसकी थोड़ी आसान सोचें।
eseglem

हां, यह पंक्तियों को अपडेट करने का एक वैध तरीका है। असल में, मैंने कुछ सप्ताह पहले तक अपडेट () में पारित मूल्य नहीं देखा था। यह वास्तव में ज्यामिति को अद्यतन करने के लिए एक उदाहरण था।
पॉल

आपके उत्तर के लिए बहुत बहुत धन्यवाद PolyGeo! मैं वास्तव में बहुत प्रभावित हुआ कि कोड ने संशोधनों के बिना काम किया। मैं ArcGIS डेस्कटॉप 10.6
Rie Mino

8

मैं अपने अंतिम समाधान के लिए मुझे अग्रणी बनाने के लिए @ कलाकृति21 का श्रेय देता हूं। मुझे वास्तव में आर्कजीआईएस 10.0 ऑनलाइन मदद आलेख में " गणना फ़ील्ड उदाहरण " नामक एक लगभग पूरी स्क्रिप्ट मिली , जो उपश्रेणी " कोड नमूने- ज्यामिति " के तहत सूचीबद्ध है और " एक बिंदु सुविधा वर्ग के लिए, प्रत्येक बिंदु के x समन्वय को 100 से स्थानांतरित करें "

अंतिम स्क्रिप्ट जो मैंने ModelBuilder "गणना फ़ील्ड" उपकरण के भीतर उपयोग की थी:

अभिव्यक्ति:

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

जहाँ ShiftX और ShiftY वैरिएबल मॉडल के रूप में परिभाषित चर (पैरामीटर के रूप में) हैं।

अभिव्यक्ति प्रकार:

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 पैरामीटर को उपयुक्त कॉलम में असाइन करें।
रियानकैल्टन

मैं उलझन में हूँ कि आप यहाँ "आकार" के रूप में क्या कर रहे हैं। क्या आप कृपया मेरी मदद कर सकते हैं?
jbchurchill

"एक्सप्रेशन" उन मापदंडों को दिखाता है जिन्हें कोड-ब्लॉक फ़ंक्शन में शिफ्ट किया जा रहा है जिन्हें शिफ्टएक्सवाईकोऑर्डिनेट () कहा जाता है। तो पहला पैरामीटर है! SHAPE !, जो कि लेयर से शेप फील्ड है।
रयानकैल्टन

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 और बिंदु ।Y + = myMoveY इसके बजाय X और Y में पास करने की आवश्यकता है, हालांकि इसके लिए निर्देशांक।
आइजेलम

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

और यदि शिफ्टएक्सवाईकोऑर्डिनेट्स (! शेप !,! एंगल!, 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.