ArcMap에서 여러 모양 파일에 대한 투영을 정의 하시겠습니까?


29

.prj 파일이없는 100 개 이상의 모양 파일이 있으므로 ArcMap 10으로 가져올 때 좌표계를 알 수없는 것으로 표시합니다. 모든 형상 파일 좌표계가 GCS WGS 1984라는 것을 알고 있습니다. 또한 투영 GP 정의 도구를 사용하여 좌표계를 각 파일에 개별적으로 할당 할 수 있지만 시간이 오래 걸릴 것입니다.

배치를 정의하는 GP 도구가 있기를 바랐지만 보이지 않습니다. 다음으로 파이썬을 사용 하여이 작업을 수행 할 수 있다고 생각했기 때문에 도움말 메뉴를보고 스크립트를 찾았지만 오류가 발생했습니다.

여기에 내가 시도한 파이썬 코드가 있습니다 (이것은 단일 shp 파일에 대한 것이므로 각 파일의 이름을 입력하는 데 어려움이 있습니다.

import arcpy
infc = r"C:\Documents and Settings\User\My Documents\ArcGIS\shpfiles\Site_2.shp"
prjfile = r"<install directory>\Coordinate Systems\Geographic Coordinate Systems\World\WGS 1984.prj"
arcpy.DefineProjection_management(infc, prjfile)

그러나 다중 래스터 파일의 투영을 정의하려면 어떻게해야합니까?

답변:


29

너희들이 이걸 너무 생각하고있는 것 같아

  1. 도구 상자에서 "투영 정의"도구를 마우스 오른쪽 버튼으로 클릭하고
  2. "배치"를 선택하고
  3. 레이어를 "입력 데이터 세트"열에 끌어다 놓으십시오.
  4. 첫 번째 '좌표계'상자를 마우스 오른쪽 버튼으로 클릭하여 올바른 투영을 채 웁니다.
  5. 방금 선택한 투영을 마우스 오른쪽 버튼으로 클릭하고 "채우기"를 선택하면 나머지 투영이 모두 채워집니다.
  6. "확인"을 누르면 완료됩니다.

대체 텍스트


실제로 OS 폴더에 Shapefile .PRJ 도우미 파일을 생성합니까, 아니면 레이어 속성에 주석을 달까요? 그리고 ArcGIS도 시작해야합니다. Jay가 작성한 Python 스크립트는 ArcGIS 외부에서 완전히 작동하며 특정 결과는 ESRI 이외의 요구에 적합합니다.
V 스튜어트 푸트

예. "투영 정의"도구는 처리 된 모든 쉐이프 파일에 대한 PRJ 파일을 작성합니다. Jay가 게시 한 python 스크립트는 아마 훌륭하게 작동 할 것이라는 데 동의하지만, 스크립팅은 보통 일반 GIS 전문가의 기술 범위를 벗어난 반면 푸시 버튼 "Define Projection"유틸리티는 그렇지 않습니다.
RyanDalton

1
고마워 Ryan, GP 도구를 마우스 오른쪽 버튼으로 클릭하여 더 많은 옵션을 얻을 수 있다고 생각하지 않습니다. 그것은 좋은 속임수이며 내가 찾던 것입니다. 매우 감사.
wilbev

13

이들이 같은 디렉토리에 있다면 다음과 같이 작동합니다 (경로를 바꾸고 예외 처리를 추가하십시오).

import os, shutil

wgs84prjpath='c:/Program Files/ArcGIS/Desktop10.0/Coordinate Systems/Geographic Coordinate Systems/World/WGS 1984.prj'

def definewgs84(shpfilepath):
    tgtpath = os.path.splitext(shpfilepath)[0] + '.prj'
    shutil.copyfile(wgs84prjpath,tgtpath)


yourshapefiledirectory='C:/temp/'
extension='shp'

shpfileslist = [file for file in os.listdir(yourshapefiledirectory) if file.lower().endswith(extension)]

for filename in shpfileslist:
    definewgs84(os.path.join(yourshapefiledirectory,filename))

파이썬에 더 사용하는 법을 배우고 싶지만 성공하지 못했습니다. 'os'이름에서 오류가 발생했습니다. 아래 오류 메시지에 붙여 넣었습니다. 어떤 아이디어가 잘못되었을 수 있습니까?
wilbev

오류에 붙여 넣기 전에 추가되어 죄송합니다. 런타임 오류 <type 'exceptions.NameError'> : name 'os'가 정의되지 않았습니다.
wilbev

죄송합니다 ... 수입품이 도움이 될 것입니다! :( import os, shutil 업데이트 된 답변 참조) docs.python.org/tutorial/stdlib.html 있어야합니다.
Jay Cummins

9

.prj를 복사하고 이름을 바꾸십시오. 예를 들어 3 개의 shapefile이있는 경우 :

  • one.shp,
  • two.shp,
  • 삼 .hp.

one.shp의 투영을 정의하면 디렉토리에 one.prj가 있습니다. one.prj를 two.shp의 디렉토리에 복사하고 이름을 two.prj로 바꾸고 모든 shapefile에 대해 반복하십시오. .prj는 텍스트 파일 일뿐입니다. .shp와 동일한 디렉토리에 동일한 이름을 가진 .prj가 있으면 소프트웨어가이를 선택합니다. 파일 복사 및 이름 바꾸기에 익숙한 도구로 자동화하십시오.


4

편집하다:

아마도 가장 쉬운 방법 일 것입니다. 그것들을 모두 가져 와서 올바른 crs를 문서에 할당하십시오. 그들은 "투영"될 것이지만 올바른 장소에 앉아있을 것입니다. 그런 다음 새 위치로 여러 항목을 내보내십시오.

배치 프로젝션을위한 GP 도구가 표시됩니다.

배치 프로젝트

아크 피에 노출되지 않을 수 있습니다. ??

pgdb (File, personal 또는 sde)를 만든 다음 fds (feature data set)를 만들 것이라고 생각합니다.

해당 crd를 해당 fd에 지정하십시오.

모양 파일을 가져옵니다 (여러 개). [fds의 모든 fc는 fds의 crs를 상속합니다].

그런 다음 모양 파일 (여러)로 내보낼 수 있습니다.

이것은 배치 프로젝션 대신에 스크립트로 작성 될 수 있습니다.


이 방법은 효과가 있지만 Ryan Dalton이 제안한 것보다 훨씬 오래 걸립니다. 피쳐 클래스로 100 개가 넘는 쉐이프 파일을 가져 오는 것은 매우 느립니다.
wilbev


1

여기에 내가 사용하는 것이 있습니다 ... 투영이없는 래스터 파일의 투영 만 정의합니다. 도움이 되길 바랍니다. 또한 품질 보증 목적으로 프로젝션없이 파일 목록을 작성합니다.

벡터의 경우 약간의 모드가 필요합니다-FileList = arcpy.ListFeatureClasses ()

# Defines projection for all rasters with undefined projection
# CAUTION - make sure you know that the projection you are defining is the correct one
# for all files in the current directory.

#Licence: Creative Commons
#Created by: George Corea; georgec@atgis.com.au, coreagc@gmail.com

import arcpy, glob, os, sys, arcgisscripting
from arcpy import env, mapping
path = os.getcwd()
env.workspace = path
env.overwriteOutput = True

print 'Reading files from ' + path
os.chdir(path)
prjFile=r'C:\\Python26\\GDA_1994_MGA_Zone_55.prj'

x=0
z=x+1
NoProjCount=0
FileList= arcpy.ListRasters()
for File in FileList:
    desc = arcpy.Describe(File)
    SR = desc.spatialReference
    if SR.name == "Unknown":
        print "Projection of " + str(File) + " is " + SR.name + " so defining projection."
        f = open('NoProjection.txt', 'a')
        f.write(str(File)+"\n")
        f.close()
        arcpy.DefineProjection_management(File, prjFile) 
        NoProjCount=NoProjCount+1
    else:    
        print File + " is projected " + str(SR.name)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.