Отримання широти та довготи прогнозованої точки за допомогою ArcPy? [зачинено]


13

У мене є точкова функція в класі функцій, до яких звертається ArcPy. Точка прогнозується, але мені потрібно знайти ефективний засіб для отримання непрогнозованої широти та довготи для цієї точки.

Чи існує інший метод, крім перепроектування (непроектування), отримання курсору пошуку в новому класі функцій, пошуку функції, а потім отримання lat / lon з форми функції?

Відповіді:


6

SearchCursor підтримує вказівку просторової посилання - у цьому випадку вам потрібна географічна система координат, наприклад WGS 1984. Потім ви перейдете курсором і витягніть x & y з форми, дивіться тут .


6

Більшість інших відповідей були опубліковані, коли ArcGIS 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 для створення просторового опорного об'єкта, а не введення рядкового представлення, використання більш сучасних курсорів доступу до даних та проектування окремих об’єктів геометрії за допомогою методу projectAs () .


приємна відповідь. Я б просто запропонував переключити X і Y на друк, тому що в WGS84 загальний порядок є lat / long
radouxju

навіть простіше, просто зробіть це. srs = arcpy.SpatialReference (4326) xy_coords = arcpy.da.FeatureClassToNumPyArray (input_feature_class, 'SHAPE @ XY', space_reference = srs) print (xy_coords)
dfresh22

5

Щоб уточнити пропозицію Джеймса, ось мінімальний приклад коду з використанням 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

Незалежно від того, називаєте ви це проекцією чи ні, я впевнений, що за визначенням, коли ви переводите значення координат з однієї просторової системи відліку в іншу, ви повторно / не проектуєте.

Я не так знайомий з ArcPy, але в аргскрискриптурі в 9.3 вам доведеться спроектувати весь клас функцій.

Залежно від того, наскільки складний алгоритм проекції / перетворення вам потрібен, ви завжди можете згорнути власну проекцію для координат у базовій математиці пітона. Це дозволить вам узгодити проекцію значення на рівні функції.

Якщо ви були відкриті для використання прив'язки пітонів OGR, ви можете проектувати на рівні функції в межах типу "курсор пошуку".


На жаль, я не можу використовувати не-ESRI речі зі сценарієм, який я використовую. Навіть незважаючи на те, що навіть ESRI використовує OGR та GDAL (нікому не кажіть, правда?) ...
Kenton W

Насправді, кращим маршрутом може бути з'ясування того, як якось використовувати PROJ4 безпосередньо на вхідних координатах.
Кентон Ш

@Kenton - Чи включає також ваш власний власний алгоритм (на основі існуючого коду)? Якщо вам потрібно перетворити UTM -> WGS84, у мене є код, щоб це зробити в python, який я можу опублікувати. Ви також можете витягти потрібний алгоритм із Proj4 і використовувати його замість цього. Або якщо ви дійсно обмежені у використанні коду ESRI (і не хочете проектувати цілий клас функцій, як пропонується), напишіть просту бібліотеку C для проектування за допомогою ArcObjects, а потім викликайте її з Python за допомогою ctypes. Або дотримуйтесь аркпію та проектуйте цілий клас функцій :(
Саса Іветік

@Kenton - Швидкий пошук повертає pyproj ( code.google.com/p/pyproj ), ви можете подивитися це на прикладі того, як використовувати python для виклику бібліотеки Proj4.
Саса Іветич

@Kenton - Якщо це проекція UTM NAD83 => географічна WGS84 без перетворення дат, ви повинні мати можливість реалізувати алгоритм у чистому пітоні. Рівняння знаходяться в книзі Снайдера: onlinepubs.er.usgs.gov/djvu/PP/PP_1395.pdf У мене є функція Oracle PL / SQL, яка робить це, якщо потрібно код. Я мав на увазі перенести цю функцію на Python, але зазвичай просто використовую ogr / osr ...
DavidF

4

У ArcPy 10.0 немає можливості проектувати окремі геометрії. Однак ви можете створити набір функцій (або клас функцій в пам'яті) та спроектувати, що замість повномасштабного класу функцій у робочій області на диску чи в базі даних десь.


саме цього я сподівався уникнути. Змушує побажати сили, до якої можна потрапити. Net з ArcObjects ...
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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.