ArcPy का उपयोग करके अनुमानित बिंदु का अक्षांश और देशांतर प्राप्त करना? [बन्द है]


13

मेरे पास एक फीचर क्लास में एक पॉइंट फीचर है जो आर्कपी द्वारा एक्सेस किया जा रहा है। बिंदु का अनुमान लगाया गया है, लेकिन मुझे इस बिंदु के लिए असुरक्षित अक्षांश और देशांतर प्राप्त करने के लिए एक कुशल साधन खोजने की आवश्यकता है।

क्या रीप्रोजेक्ट करने (अनप्रोजेक्टिंग) के अलावा कोई तरीका है, जो नए फीचर क्लास पर सर्च कर्सर ले रहा है, फीचर ढूंढ रहा है, फिर फीचर के शेप से लेट / लोन प्राप्त कर रहा है?

जवाबों:


6

SearchCursor एक स्थानिक संदर्भ निर्दिष्ट करने का समर्थन करता है- इस मामले में, आप एक भौगोलिक समन्वय प्रणाली चाहते हैं, जैसे कि WGS 1984। इसके बाद आप कर्सर के माध्यम से पुनरावृति करते हैं और x & y को आकृति से पकड़ते हैं, यहाँ देखें


6

आर्कजीआईएस 10.0 नवीनतम सॉफ्टवेयर था जब अधिकांश अन्य उत्तर सभी पोस्ट किए गए थे। ArcGIS 10.1 में बहुत नई ArcPy कार्यक्षमता उपलब्ध हुई। यह उत्तर उस नई कार्यक्षमता का लाभ उठाता है। यह 10.0 के लिए उपयुक्त नहीं होगा, लेकिन 10.1 और बाद के लिए बढ़ा हुआ प्रदर्शन और कार्यक्षमता प्रदान करता है।

import arcpy

input_feature_class = 'C:\your_feature_class.shp'
wkid = 4326 # wkid code for wgs84
spatial_reference = arcpy.SpatialReference(wkid)

fields_to_work_with = ['SHAPE@']

with arcpy.da.SearchCursor(input_feature_class,
                           fields_to_work_with) as s_cur:
    for row in s_cur:
        point_in_wgs84 = row[0].projectAs(spatial_reference)
        print point_in_wgs84.firstPoint.X, point_in_wgs84.firstPoint.Y

यह कोड स्निपेट , स्ट्रिंग प्रतिनिधित्व को टाइप करने के बजाय एक स्थानिक संदर्भ ऑब्जेक्ट बनाने के लिए wkid का उपयोग करता है, और अधिक आधुनिक डेटा एक्सेस कर्सर का उपयोग करता है , और प्रोजेक्ट्स () विधि का उपयोग करके व्यक्तिगत ज्यामिति वस्तुओं को प्रोजेक्ट करता है ।


अच्छा उत्तर। मैं केवल X और Y को प्रिंट में बदलने का सुझाव
दूंगा

और भी सरल, बस यह करो। srs = arcpy.SpatialReference (4326) xy_coords = arcpy.da.FeatureClassToNumPyArray (input_feature_class, 'SHAPE @ XY, spatial_reference = srs) प्रिंट (xy_coords)
dfresh22

5

जेम्स के सुझाव पर विस्तार से बताने के लिए, यहाँ पायथन / आर्कपी का उपयोग करते हुए एक न्यूनतम कोड उदाहरण दिया गया है:

import arcpy

def main():
    projectedPointFC = r'c:\point_test.shp'
    desc = arcpy.Describe(projectedPointFC)
    shapefieldname = desc.ShapeFieldName

    rows = arcpy.SearchCursor(projectedPointFC, r'', \
                              r'GEOGCS["GCS_WGS_1984",' + \
                              'DATUM["D_WGS_1984",' + \
                              'SPHEROID["WGS_1984",6378137,298.257223563]],' + \
                              'PRIMEM["Greenwich",0],' + \
                              'UNIT["Degree",0.017453292519943295]]')

    for row in rows:
        feat = row.getValue(shapefieldname)
        pnt = feat.getPart()
        print pnt.X, pnt.Y

if __name__ == '__main__':
    main()

4

आप इसे प्रक्षेपण कहते हैं या नहीं, मुझे पूरा यकीन है कि परिभाषा के अनुसार, जब आप एक स्थानिक संदर्भ प्रणाली से दूसरे में समन्वयित मूल्यों का अनुवाद कर रहे हैं, तो आप फिर से अन-प्रोजेक्ट कर रहे हैं।

मैं आर्कपी से परिचित नहीं हूं, लेकिन 9.3 में आर्कगिसस्क्रिप्टिंग में, आपको संपूर्ण फीचर क्लास प्रोजेक्ट करना होगा।

एक प्रोजेक्शन / ट्रांसमिशन एल्गोरिदम की आपको कितनी आवश्यकता है, इस पर निर्भर करते हुए, आप हमेशा बुनियादी अजगर गणित में निर्देशांक के लिए अपने खुद के प्रक्षेपण को रोल कर सकते हैं। यह आपको सुविधा स्तर पर मूल्य प्रक्षेपण के समन्वय की अनुमति देगा।

यदि आप OGR अजगर बाइंडिंग का उपयोग करने के लिए खुले थे, तो आप 'खोज कर्सर' जैसी किसी चीज़ के भीतर फ़ीचर स्तर पर प्रोजेक्ट कर सकते हैं।


दुर्भाग्य से मैं जिस स्क्रिप्ट का उपयोग कर रहा हूं उसके साथ गैर-ईएसआरआई सामान का उपयोग नहीं कर सकता। भले ही ESRI OGR और GDAL का उपयोग करता है (किसी को न बताएं, ठीक है?) ...
Kenton W

वास्तव में, बेहतर मार्ग यह पता लगाना हो सकता है कि इनपुट पर सीधे PROJ4 का उपयोग कैसे किया जाए।
केंटन डब्ल्यू

@ कॉंटन - क्या इसमें आपका अपना कस्टम एल्गोरिथ्म भी शामिल है (मौजूदा कोड के आधार पर)? यदि आपको UTM -> WGS84 में कनवर्ट करने की आवश्यकता है, तो मेरे पास यह करने के लिए कोड है कि अजगर में मैं पोस्ट कर सकता हूं। वैकल्पिक रूप से, आप प्रोज 4 से आवश्यक एल्गोरिथ्म निकाल सकते हैं और इसके बजाय इसका उपयोग कर सकते हैं। या यदि आप वास्तव में ईएसआरआई कोड का उपयोग करने के लिए विवश हैं (और सुझाए गए संपूर्ण फीचर क्लास को प्रोजेक्ट नहीं करना चाहते हैं), आर्कओबजेक्ट्स का उपयोग करके प्रोजेक्ट करने के लिए एक साधारण सी लाइब्रेरी लिखें, फिर इसे ctypes का उपयोग करके पायथन से कॉल करें। या चापलूसी के साथ रहना और एक संपूर्ण फीचर क्लास प्रोजेक्ट करना :(
Sasa Ivetic

@Kenton - क्विक सर्च रिटर्न pyproj ( code.google.com/p/pyproj ), आप इसे देख सकते हैं कि कैसे Proj4 लाइब्रेरी को कॉल करने के लिए अजगर का उपयोग करें।
Sasa Ivetic

@Kenton - यदि यह कोई UTM NAD83 => भौगोलिक WGS84 प्रक्षेपण है जिसमें कोई डाटम परिवर्तन नहीं है, तो आपको एल्गोरिथ्म को शुद्ध अजगर में लागू करने में सक्षम होना चाहिए। समीकरण स्नाइडर की पुस्तक में हैं: onlinepubs.er.usgs.gov/djvu/PP/PP_1395.pdf मेरे पास एक Oracle PL / SQL फ़ंक्शन है जो यदि आप कोड चाहते हैं तो ऐसा होता है। मैं इस फ़ंक्शन को पायथन में पोर्ट करने के लिए अर्थ रखता हूं, लेकिन आमतौर पर केवल ओग / ओस्र का उपयोग करते हैं ...
डेविड एफएफ

4

आर्कपी 10.0 में व्यक्तिगत ज्यामितीयों को प्रोजेक्ट करने की क्षमता नहीं है। हालाँकि, आप एक फ़ीचर सेट (या इन-मेमोरी फ़ीचर क्लास) बना सकते हैं और प्रोजेक्ट कर सकते हैं कि डिस्क पर या किसी डेटाबेस में किसी कार्यक्षेत्र में पूर्ण-विकसित फीचर क्लास के बजाय।


जो वास्तव में मैं बचने की उम्मीद कर रहा था। मुझे उस शक्ति की कामना है जो आप को मिल सकती है। आर्कओबजेक्ट्स के साथ .नेट में ...
Kenton W

0

मुख्य कारण मैं देख सकता हूँ कि एक फीचर क्लास नहीं बनाना चाहता क्योंकि arcpy.CreateFeatureclass_management धीमा हो सकता है। आप arcpy.da.NumPyArrayTofeatureClass का भी उपयोग कर सकते हैं, जो in_memory फीचर कक्षाओं के लिए कम या ज्यादा त्वरित है:

In [1]: import arcpy

In [2]: import numpy as np

In [3]: geosr = arcpy.SpatialReference('Geographic Coordinate Systems/Spheroid-based/WGS 1984 Major Auxiliary Sphere')

In [4]: tosr = arcpy.SpatialReference('Projected Coordinate Systems/World/WGS 1984 Web Mercator (auxiliary sphere)')

In [5]: npai=list(enumerate(((-115.12799999956881, 36.11419999969922), (-117, 38.1141))))

In [6]: npai
Out[6]: [(0, (-115.12799999956881, 36.11419999969922)), (1, (-117, 38.1141))]

In [7]: npa=np.array(npai, np.dtype(([('idfield', np.int32), ('XY', np.float, 2)])))

In [8]: npa
Out[8]: 
array([(0, [-115.12799999956881, 36.11419999969922]),
       (1, [-117.0, 38.1141])], 
      dtype=[('idfield', '<i4'), ('XY', '<f8', (2,))])

In [9]: fcName = arcpy.CreateScratchName(workspace='in_memory', data_type='FeatureClass')

In [10]: arcpy.da.NumPyArrayToFeatureClass(npa, fcName, ['XY'], geosr)

In [11]: with arcpy.da.SearchCursor(fcName, 'SHAPE@XY', spatial_reference=tosr) as cur:
    ...:     print list(cur)
    ...:     
[((-12815990.336048, 4316346.515041453),), ((-13024380.422813002, 4595556.878958654),)]

-1
import arcpy
dsc = arcpy.Describe(FC)
cursor = arcpy.UpdateCursor(FC, "", "Coordinate Systems\Geographic Coordinate   Systems\World\WGS 1984.prj")
for row in cursor:
  shape=row.getValue(dsc.shapeFieldName)
  geom = shape.getPart(0)
  x = geom.X
  y = geom.Y
  row.setValue('LONG_DD', x)
  row.setValue('LAT_DD', y)
  cursor.updateRow(row)

del cursor, row
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.