ArcPy를 사용하여 투영 점의 위도 및 경도를 얻으십니까? [닫은]


13

ArcPy가 액세스하는 피쳐 클래스에 포인트 피쳐가 있습니다. 점이 투영되었지만이 점에 대해 투영되지 않은 위도 및 경도를 얻는 효율적인 방법을 찾아야합니다.

재 투영 (비 투영), 새 피쳐 클래스에서 검색 커서 가져 오기, 피쳐를 찾은 다음 피쳐의 모양에서 위도 / 경도를 얻는 방법 이외의 방법이 있습니까?

답변:


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 () 메소드를 사용하여 개별 지오메트리 객체를 투영합니다 .


좋은 대답입니다. 단순히 WGS84의 일반적인 순서는 긴 / 위도 때문에, 인쇄에서 X와 Y를 전환 제안
radouxju

더 간단하게이 작업을 수행하십시오. srs = arcpy.SpatialReference (4326) xy_coords = arcpy.da.FeatureClassToNumPyArray (input_feature_class, 'SHAPE @ XY', patial_reference = srs) print (xy_coords)
dfresh22

5

James의 제안에 대해 자세히 설명하기 위해 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의 arcgisscripting에서는 전체 피처 클래스를 투영해야합니다.

필요한 투영 / 변환 알고리즘의 복잡성에 따라 기본 파이썬 수학에서 좌표에 대한 자체 투영을 롤링 할 수 있습니다. 이를 통해 피처 레벨에서 값 프로젝션을 조정할 수 있습니다.

OGR python 바인딩을 사용할 수 있다면 '검색 커서'와 같은 기능 수준에서 기능 수준으로 투영 할 수 있습니다.


불행히도 사용중인 스크립트로 ESRI 이외의 것을 사용할 수 없습니다. ESRI조차도 OGR과 GDAL을 사용하지만 (아무 말도하지 않습니까?) ...
Kenton W

실제로 더 나은 경로는 어떻게 든 입력 좌표에서 PROJ4를 직접 사용하는 방법을 찾는 것입니다.
Kenton여

@ Kenton-기존 코드를 기반으로 한 사용자 정의 알고리즘도 포함되어 있습니까? UTM-> WGS84를 변환 해야하는 경우 파이썬에서 게시 할 수있는 코드가 있습니다. 또는 Proj4에서 필요한 알고리즘을 추출하여 대신 사용할 수 있습니다. 또는 ESRI 코드를 사용하도록 제한되어 있고 제안 된 것과 같은 전체 기능 클래스를 투영하지 않으려는 경우 ArcObject를 사용하여 투영 할 간단한 C 라이브러리를 작성한 다음 ctypes를 사용하여 Python에서 호출하십시오. 또는 arcpy를 고수하고 전체 기능 클래스를 투영하십시오. (
Sasa Ivetic

@Kenton-빠른 검색은 pyproj ( code.google.com/p/pyproj )를 반환 합니다. python을 사용하여 Proj4 라이브러리를 호출하는 방법에 대한 예제를 살펴볼 수 있습니다.
Sasa Ivetic

@Kenton-데이텀 변환이없는 UTM NAD83 => 지리적 WGS84 투영 인 경우 순수 파이썬으로 알고리즘을 구현할 수 있어야합니다. 방정식은 Snyder의 저서에 있습니다 : onlinepubs.er.usgs.gov/djvu/PP/PP_1395.pdf 코드를 원할 경우이를 수행하는 Oracle PL / SQL 함수가 있습니다. 나는이 함수를 파이썬으로 포팅하는 것을 의미했지만 보통 ogr / osr을 사용한다.
DavidF

4

ArcPy 10.0에서는 개별 형상을 투영 할 수 없습니다. 그러나 기능 세트 (또는 인 메모리 기능 클래스)를 작성하고 디스크의 작업 공간 또는 데이터베이스의 전체 작업 피쳐 클래스 대신 전체 기능 클래스 대신 프로젝트를 작성할 수 있습니다.


정확히 내가 피하기를 바랐습니다. ArcObjects를 사용하여 .Net에서 얻을 수있는 힘을 원합니다 ...
Kenton W

0

피처 클래스를 만들고 싶지 않은 주된 이유는 arcpy.CreateFeatureclass_management가 느릴 수 있기 때문입니다. in_memory 피처 클래스에 대해 거의 즉각적인 arcpy.da.NumPyArrayTofeatureClass를 사용할 수도 있습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.