¿Obtener la latitud y longitud del punto proyectado usando ArcPy? [cerrado]

13

Tengo una entidad de puntos en una clase de entidad a la que ArcPy está accediendo. El punto se proyecta, pero necesito encontrar un medio eficiente para obtener la latitud y longitud no proyectada para este punto.

¿Hay un método que no sea reproyectar (desaprobar), obtener un cursor de búsqueda en la nueva clase de entidad, encontrar la entidad y luego quitar el lat / lon de la forma de la entidad?

    
pregunta Kenton W 05.04.2011 - 17:41

7 respuestas

6

El SearchCursor admite la especificación de una referencia espacial. En este caso, querría un Sistema de coordenadas geográficas, como WGS 1984. Luego, itere a través del cursor y tome la x & y de la forma, vea aquí .

    
respondido por el James 21.09.2011 - 15:43
6

La mayoría de las demás respuestas se publicaron cuando ArcGIS 10.0 era el último software. En ArcGIS 10.1 mucha nueva funcionalidad de ArcPy estuvo disponible. Esta respuesta aprovecha esa nueva funcionalidad. No será adecuado para 10.0, pero ofrece un mayor rendimiento y funcionalidad para 10.1 y versiones posteriores.

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 = ['[email protected]']

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

Este fragmento de código utiliza wkid para crea un objeto de referencia espacial en lugar de escribir una representación de cadena, utiliza el más moderno cursores de acceso a datos , y proyecta el objetos de geometría individuales usando el método projectAs () .

    
respondido por el GeoSharp 11.08.2017 - 00:22
5

Para elaborar la sugerencia de James, aquí hay un ejemplo de código mínimo que utiliza 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()
    
respondido por el Allan Adair 21.09.2011 - 16:14
4

Ya sea que lo llame proyección o no, estoy bastante seguro de que, por definición, cuando traduce los valores de coordenadas de un sistema de referencia espacial a otro, está re / des-proyectando.

No estoy muy familiarizado con ArcPy, pero en arcgisscripting a 9.3, tendría que proyectar toda la clase de entidad.

Dependiendo de la complejidad de un algoritmo de proyección / transformación que necesite, siempre puede hacer rodar su propia proyección para las coordenadas en las matemáticas básicas de Python. Esto le permitiría coordinar la proyección de valores en el nivel de función.

Si estaba abierto a usar los enlaces de Python OGR, puede proyectar en el nivel de la característica dentro de algo como un 'cursor de búsqueda'.

    
respondido por el DavidF 05.04.2011 - 19:33
4

En ArcPy 10.0 no hay capacidad para proyectar geometrías individuales. Sin embargo, puede crear un conjunto de características (o una clase de entidad en memoria) y proyectar que, en lugar de una clase de entidad completa en un área de trabajo en el disco o en una base de datos en algún lugar.

    
respondido por el Philip 06.04.2011 - 04:52
0

La razón principal por la que veo que no quiero crear una clase de entidad es porque arcpy.CreateFeatureclass_management puede ser lento. También puede usar arcpy.da.NumPyArrayTofeatureClass, que es más o menos instantáneo para las clases de entidad 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, '[email protected]', spatial_reference=tosr) as cur:
    ...:     print list(cur)
    ...:     
[((-12815990.336048, 4316346.515041453),), ((-13024380.422813002, 4595556.878958654),)]
    
respondido por el cwa 11.06.2013 - 23:25
-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
    
respondido por el ThinkSpatially 11.12.2013 - 19:19

Lea otras preguntas en las etiquetas