답변:
다른 답변의 대부분은 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 () 메소드를 사용하여 개별 지오메트리 객체를 투영합니다 .
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()
프로젝션이라고 부르든 아니든, 정의에 따라 좌표 값을 한 공간 참조 시스템에서 다른 공간 참조 시스템으로 변환 할 때 재 투영 중임을 확신합니다.
나는 ArcPy에 익숙하지 않지만 9.3의 arcgisscripting에서는 전체 피처 클래스를 투영해야합니다.
필요한 투영 / 변환 알고리즘의 복잡성에 따라 기본 파이썬 수학에서 좌표에 대한 자체 투영을 롤링 할 수 있습니다. 이를 통해 피처 레벨에서 값 프로젝션을 조정할 수 있습니다.
OGR python 바인딩을 사용할 수 있다면 '검색 커서'와 같은 기능 수준에서 기능 수준으로 투영 할 수 있습니다.
피처 클래스를 만들고 싶지 않은 주된 이유는 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),)]
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