Mendapatkan lintang dan bujur dari titik yang diproyeksikan menggunakan ArcPy? [Tutup]

13

Saya memiliki fitur titik di kelas fitur yang sedang diakses oleh ArcPy. Titik ini diproyeksikan tetapi saya perlu menemukan cara yang efisien untuk mendapatkan garis lintang dan bujur yang tidak terproyeksi untuk titik ini.

Apakah ada metode selain memproyeksikan (tidak memproyeksikan), mendapatkan kursor pencarian pada kelas fitur baru, menemukan fitur, kemudian mendapatkan lat / lon dari bentuk fitur?

Kenton W
sumber

Jawaban:

6

SearchCursor mendukung menentukan referensi spasial - dalam hal ini, Anda ingin Sistem Koordinat Geografis, seperti WGS 1984. Kemudian Anda beralih melalui kursor dan ambil x & y dari bentuk, lihat di sini .

James
sumber
6

Sebagian besar jawaban lain semuanya diposting ketika ArcGIS 10.0 adalah perangkat lunak terbaru. Di ArcGIS 10.1, banyak fungsionalitas ArcPy baru tersedia. Jawaban ini memanfaatkan fungsionalitas baru itu. Ini tidak akan cocok untuk 10.0 tetapi menawarkan peningkatan kinerja dan fungsionalitas untuk 10.1 dan yang lebih baru.

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

Cuplikan kode ini menggunakan wkid untuk membuat objek referensi spasial daripada mengetik representasi string, menggunakan kursor akses data yang lebih modern , dan memproyeksikan objek geometri individual menggunakan metode projectAs () .

GeoSharp
sumber
jawaban bagus. Saya hanya akan menyarankan untuk beralih X dan Y di cetak, karena dalam WGS84 urutan umum adalah lat / long
radouxju
lebih sederhana, lakukan saja ini. srs = arcpy.SpatialReference (4326) xy_coords = arcpy.da.FeatureClassToNumPyArray (input_feature_class, 'SHAPE @ XY', spatial_reference = srs) cetak (xy_coords)
dfresh22
5

Untuk menguraikan saran James, berikut adalah contoh kode minimal menggunakan Python / arcpy:

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()
Allan Adair
sumber
4

Apakah Anda menyebutnya proyeksi atau tidak, saya cukup yakin bahwa menurut definisi, ketika Anda menerjemahkan nilai koordinat dari satu sistem referensi spasial ke yang lain, Anda sedang kembali / tidak memproyeksikan.

Saya tidak begitu mengenal ArcPy, tetapi dalam arcgisscripting di 9.3, Anda harus memproyeksikan seluruh kelas fitur.

Bergantung pada seberapa rumitnya algoritma proyeksi / transormasi yang Anda butuhkan, Anda selalu dapat menggulirkan proyeksi Anda sendiri untuk koordinat dalam matematika python dasar. Ini akan memungkinkan Anda untuk mengoordinasikan proyeksi nilai di tingkat fitur.

Jika Anda terbuka untuk menggunakan binding python OGR, Anda dapat memproyeksikan pada tingkat fitur dalam sesuatu seperti 'kursor pencarian'.

DavidF
sumber
Sayangnya saya tidak dapat menggunakan hal-hal non-ESRI dengan skrip yang saya gunakan. Meskipun bahkan ESRI menggunakan OGR dan GDAL (jangan beri tahu siapa pun, bukan?) ...
Kenton W
Sebenarnya, rute yang lebih baik mungkin untuk mengetahui cara menggunakan PROJ4 secara langsung pada koordinat input.
Kenton W
@Kenton - Apakah itu juga termasuk algoritme kustom Anda sendiri (berdasarkan kode yang ada)? Jika Anda perlu mengonversi UTM -> WGS84, saya punya kode untuk melakukannya dengan python yang bisa saya posting. Sebagai alternatif, Anda bisa mengekstrak algoritma yang diperlukan dari Proj4 dan menggunakannya. Atau jika Anda benar-benar terpaksa menggunakan kode ESRI (dan tidak ingin memproyeksikan seluruh kelas fitur seperti yang disarankan), tulis pustaka C sederhana untuk diproyeksikan menggunakan ArcObjects, lalu panggil dari Python menggunakan ctypes. Atau gunakan arcpy dan proyeksikan seluruh kelas fitur :(
Sasa Ivetic
@Kenton - Pencarian cepat menghasilkan pyproj ( code.google.com/p/pyproj ), Anda dapat melihatnya sebagai contoh cara menggunakan python untuk memanggil perpustakaan Proj4.
Sasa Ivetic
@Kenton - Jika ini adalah proyeksi UTM NAD83 => geografis WGS84 tanpa transformasi datum, Anda harus dapat mengimplementasikan algoritma dalam python murni. Persamaannya ada dalam buku Snyder: onlinepubs.er.usgs.gov/djvu/PP/PP_1395.pdf Saya memiliki fungsi Oracle PL / SQL yang melakukan ini jika Anda menginginkan kode. Saya telah bermaksud untuk porting fungsi ini ke Python, tetapi biasanya hanya menggunakan ogr / osr ...
DavidF
4

Di ArcPy 10.0 tidak ada kemampuan untuk memproyeksikan geometri individu. Namun, Anda dapat membuat kumpulan fitur (atau kelas fitur di-memori) dan memproyeksikan bahwa alih-alih kelas fitur lengkap di ruang kerja pada disk atau di database di suatu tempat.

Philip
sumber
itulah tepatnya yang ingin saya hindari. Buat saya berharap untuk kekuatan yang bisa Anda dapatkan. Net dengan ArcObjects ...
Kenton W
0

Alasan utama yang saya lihat tidak ingin membuat kelas fitur adalah karena arcpy.CreateFeatureclass_management bisa lambat. Anda juga dapat menggunakan arcpy.da.NumPyArrayTofeatureClass, yang lebih atau kurang instan untuk kelas fitur 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),)]
cwa
sumber
-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
Berpikir dengan sabar
sumber