Lấy vĩ độ và kinh độ của điểm được chiếu bằng ArcPy? [đóng cửa]


13

Tôi có một tính năng điểm trong một lớp đối tượng đang được ArcPy truy cập. Điểm này được chiếu nhưng tôi cần tìm một phương tiện hiệu quả để có được vĩ độ và kinh độ chưa được cung cấp cho điểm này.

Có phương pháp nào khác ngoài việc từ chối (không dự đoán), lấy con trỏ tìm kiếm trên lớp tính năng mới, tìm tính năng, sau đó lấy lat / lon khỏi hình dạng của tính năng không?

Câu trả lời:


6

SearchCoder hỗ trợ chỉ định tham chiếu không gian - trong trường hợp này, bạn muốn có Hệ thống tọa độ địa lý, chẳng hạn như WGS 1984. Sau đó, bạn lặp lại qua con trỏ và lấy x & y từ hình dạng, xem tại đây .


6

Hầu hết các câu trả lời khác đều được đăng khi ArcGIS 10.0 là phần mềm mới nhất. Tại ArcGIS 10.1, nhiều chức năng ArcPy mới đã có sẵn. Câu trả lời này tận dụng chức năng mới đó. Nó sẽ không phù hợp với 10.0 nhưng cung cấp hiệu năng và chức năng tăng lên cho 10.1 trở lên.

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

Đoạn mã này sử dụng wkid để tạo một đối tượng tham chiếu không gian thay vì gõ biểu diễn chuỗi, sử dụng các con trỏ truy cập dữ liệu hiện đại hơn và chiếu các đối tượng hình học riêng lẻ bằng phương thức projectAs () .


câu trả lời tốt đẹp Tôi chỉ đơn giản đề nghị chuyển X và Y trong bản in, vì trong WGS84, thứ tự phổ biến là lat / long
radouxju

thậm chí đơn giản hơn, chỉ cần làm điều này. srs = arcpy.SpatialReference (4326) xy_coords = arcpy.da.FeatureClassToNumPyArray (input_feature_class, 'SHAPE @ XY', spatial_reference = srs) in (xy_coords)
dfresh22

5

Để giải thích về đề xuất của James, đây là một ví dụ mã tối thiểu sử dụng 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

Cho dù bạn có gọi nó là phép chiếu hay không, tôi khá chắc chắn rằng theo định nghĩa, khi bạn dịch các giá trị tọa độ từ một hệ quy chiếu không gian này sang hệ thống tham chiếu không gian khác, bạn đang chiếu lại / không chiếu.

Tôi không quen thuộc với ArcPy, nhưng trong arcgisscripting tại 9.3, bạn sẽ phải chiếu toàn bộ lớp tính năng.

Tùy thuộc vào mức độ phức tạp của thuật toán chiếu / biến đổi mà bạn cần, bạn luôn có thể cuộn phép chiếu của riêng mình cho các tọa độ trong toán học python cơ bản. Điều này sẽ cho phép bạn phối hợp chiếu giá trị ở cấp tính năng.

Nếu bạn đã sẵn sàng sử dụng các ràng buộc python OGR, bạn có thể chiếu ở cấp tính năng trong một cái gì đó như 'con trỏ tìm kiếm'.


Thật không may, tôi không thể sử dụng công cụ không phải ESRI với tập lệnh tôi đang sử dụng. Mặc dù ESRI thậm chí sử dụng OGR và GDAL (không nói cho ai biết, phải không?) ...
Kenton W

Trên thực tế, cách tốt hơn có thể là tìm ra cách sử dụng PROJ4 trực tiếp trên tọa độ đầu vào bằng cách nào đó.
Kenton W

@Kenton - Điều đó cũng bao gồm thuật toán tùy chỉnh của riêng bạn (dựa trên mã hiện có)? Nếu bạn cần chuyển đổi UTM -> WGS84, tôi có mã để làm điều đó trong python tôi có thể đăng. Thay phiên, bạn có thể trích xuất thuật toán cần thiết từ Proj4 và sử dụng thay thế. Hoặc nếu bạn thực sự bị hạn chế sử dụng mã ESRI (và không muốn chiếu toàn bộ lớp tính năng như được đề xuất), hãy viết thư viện C đơn giản để chiếu bằng ArcObjects, sau đó gọi nó từ Python bằng ctypes. Hoặc gắn bó với arcpy và chiếu toàn bộ lớp tính năng :(
Sasa Ivetic

@Kenton - Tìm kiếm nhanh trả về pyproj ( code.google.com/p/pyproj ), bạn có thể xem ví dụ về cách sử dụng python để gọi thư viện Proj4.
Sasa Ivetic

@Kenton - Nếu đó là phép chiếu UTM NAD83 => địa lý WGS84 không có biến đổi mốc, bạn sẽ có thể thực hiện thuật toán trong python thuần. Các phương trình có trong cuốn sách của Snyder: onlinepub.er.usgs.gov/djvu/PP/PP_1395.pdf Tôi có một hàm Oracle PL / SQL thực hiện điều này nếu bạn muốn mã. Tôi đã có ý định chuyển chức năng này sang Python, nhưng thường chỉ sử dụng ogr / osr ...
DavidF

4

Tại ArcPy 10.0 không có khả năng chiếu hình học riêng lẻ. Tuy nhiên, bạn có thể tạo một bộ tính năng (hoặc một lớp tính năng trong bộ nhớ) và chiếu thay vì một lớp tính năng đầy đủ trong một không gian làm việc trên đĩa hoặc trong cơ sở dữ liệu ở đâu đó.


đó chính xác là những gì tôi đã hy vọng tránh Làm cho tôi mong muốn sức mạnh mà bạn có thể có được .Net với ArcObjects ...
Kenton W

0

Lý do chính tôi có thể thấy không muốn tạo một lớp đối tượng là vì arcpy.CreateFeatureclass_man quản lý có thể bị chậm. Bạn cũng có thể sử dụng arcpy.da.NumPyArrayTofeatureClass, tức là ít nhiều tức thì cho các lớp tính năng 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.