Ottenere latitudine e longitudine del punto proiettato usando ArcPy? [chiuso]


13

Ho una funzione punto in una classe di funzionalità a cui ArcPy accede. Il punto è proiettato ma devo trovare un mezzo efficiente per ottenere la latitudine e la longitudine non proiettate per questo punto.

Esiste un metodo diverso da riproiettare (non proiettare), ottenere un cursore di ricerca sulla nuova classe di feature, trovare la feature, quindi togliere lat / lon dalla forma della feature?

Risposte:


6

SearchCursor supporta la specifica di un riferimento spaziale: in questo caso, vorresti un sistema di coordinate geografiche, come WGS 1984. Quindi esegui l'iterazione attraverso il cursore e prendi la x & y dalla forma, vedi qui .


6

La maggior parte delle altre risposte sono state pubblicate quando ArcGIS 10.0 era l'ultimo software. In ArcGIS 10.1 sono diventate disponibili molte nuove funzionalità di ArcPy. Questa risposta sfrutta questa nuova funzionalità. Non sarà adatto per 10.0 ma offre prestazioni e funzionalità migliorate per 10.1 e successive.

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

Questo frammento di codice utilizza wkid per creare un oggetto di riferimento spaziale anziché digitare una rappresentazione di stringa, utilizza i più moderni cursori di accesso ai dati e proietta i singoli oggetti geometrici utilizzando il metodo projectAs () .


bella risposta. Vorrei semplicemente suggerire di cambiare X e Y nella stampa, perché in WGS84 l'ordine comune è lat / long
radouxju

ancora più semplice, basta farlo. srs = arcpy.SpatialReference (4326) xy_coords = arcpy.da.FeatureClassToNumPyArray (input_feature_class, 'SHAPE @ XY', spatial_reference = srs) print (xy_coords)
dfresh22

5

Per approfondire il suggerimento di James, ecco un esempio di codice minimo che usa 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()

4

Che tu lo chiami proiezione o no, sono abbastanza sicuro che, per definizione, quando traduci i valori delle coordinate da un sistema di riferimento spaziale a un altro, stai ri / non proiettando.

Non ho molta familiarità con ArcPy, ma in arcgisscripting a 9.3, dovresti proiettare l'intera classe di funzionalità.

A seconda della complessità di un algoritmo di proiezione / transormazione di cui hai bisogno, puoi sempre ruotare la tua proiezione per le coordinate nella matematica di base di Python. Ciò consentirebbe di coordinare la proiezione del valore a livello di funzione.

Se eri aperto all'uso dei binding Python OGR, puoi proiettare a livello di funzionalità all'interno di qualcosa come un 'cursore di ricerca'.


Sfortunatamente non posso usare cose non ESRI con lo script che sto usando. Anche se anche ESRI usa OGR e GDAL (non dirlo a nessuno, giusto?) ...
Kenton W

In realtà, il percorso migliore potrebbe essere quello di capire come utilizzare PROJ4 direttamente sulle coordinate di input in qualche modo.
Kenton W,

@Kenton: include anche il tuo algoritmo personalizzato (basato sul codice esistente)? Se hai bisogno di convertire UTM -> WGS84, ho del codice per farlo in Python che potrei pubblicare. In alternativa, è possibile estrarre l'algoritmo richiesto da Proj4 e utilizzarlo invece. Oppure, se sei veramente costretto a usare il codice ESRI (e non vuoi proiettare un'intera classe di caratteristiche come suggerito), scrivi una semplice libreria C per proiettare usando ArcObjects, quindi chiamala da Python usando ctypes. O attenersi a arcpy e proiettare un'intera classe di funzionalità :(
Sasa Ivetic

@Kenton - La ricerca rapida restituisce pyproj ( code.google.com/p/pyproj ), potresti vederlo per un esempio di come usare python per chiamare la libreria Proj4.
Sasa Ivetic,

@Kenton - Se si tratta di una UTM NAD83 => proiezione geografica WGS84 senza trasformazione del riferimento, dovresti essere in grado di implementare l'algoritmo in puro pitone. Le equazioni sono nel libro di Snyder: onlinepubs.er.usgs.gov/djvu/PP/PP_1395.pdf Ho una funzione Oracle PL / SQL che lo fa se vuoi il codice. Volevo portare questa funzione su Python, ma di solito uso solo ogr / osr ...
DavidF

4

In ArcPy 10.0 non è possibile proiettare singole geometrie. Tuttavia, è possibile creare una serie di funzionalità (o una classe di funzionalità in memoria) e proiettare quella invece di una classe di funzionalità completa in un'area di lavoro su disco o in un database da qualche parte.


che è esattamente quello che speravo di evitare. Mi fa desiderare il potere che puoi ottenere .Net con ArcObjects ...
Kenton W,

0

Il motivo principale per cui non riesco a creare una classe di funzionalità è perché arcpy.CreateFeatureclass_management può essere lento. Puoi anche usare arcpy.da.NumPyArrayTofeatureClass, che è più o meno istantaneo per le classi di caratteristiche 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.