在ArcMap中定义多个shapefile的投影?


29

我有100多个没有.prj文件的形状文件,因此,当我将它们导入ArcMap 10时,它们会将坐标系显示为未知。我知道所有形状文件的坐标系都是GCS WGS1984。我也知道我可以使用“定义投影GP”工具分别将坐标系分配给每个文件,但这将永远花费。

我希望有一个GP工具可以批量定义这些,但是我看不到。接下来,我想也许我可以使用python来执行此操作,所以我在帮助菜单中查找并找到了一个脚本,但是它给了我一个错误。

这是我尝试的python代码(这是针对单个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)

但是,如果要为多栅格文件定义投影,该怎么办?

Answers:


29

我想你们正在考虑这个问题...

  1. 右键点击工具箱中的“定义投影”工具,
  2. 选择“批处理”,
  3. 将图层拖放到“输入数据集”列中,
  4. 在第一个“坐标系”框中单击鼠标右键以填写正确的投影,
  5. 然后右键单击刚刚选择的投影,然后选择“填充”,它将为您填写所有其余的投影。
  6. 点击“确定”,就完成了。

替代文字


这实际上是在OS文件夹中生成Shapefile .PRJ帮助程序文件,还是仅注释了图层属性?而且,您还必须启动ArcGIS。Jay编写的Python脚本将完全在ArcGIS外完成其工作,并具有某些结果-满足非ESRI的需求。
V Stuart Foote

是的,“定义投影”工具为通过它处理的所有shapefile写入PRJ文件。虽然我同意Jay发布的python脚本可能会很好用,但是脚本编写通常超出了GIS普通专家的技能范围,而按钮“ Define Projection”实用程序却并非如此。
RyanDalton 2011年

1
谢谢Ryan,我不认为您可以右键单击GP工具以获得更多选项。那是一个很好的技巧,而这正是我想要的。非常感激。
wilbev 2011年

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))

我尝试了这条路线,因为我想学习更多地使用Python,但未成功。它在'os'名称上有误。我粘贴了以下错误消息。任何想法可能有什么问题吗?
wilbev 2011年

对不起我之前在错误粘贴即得到了补充,那就是:运行时错误<类型“exceptions.NameError”>:名称“OS”是没有定义
wilbev

糟糕...导入会有所帮助! import os, shutil :(请参阅更新后的答案)。 docs.python.org/tutorial/stdlib.html应该在那里。
杰·康明斯

9

只需复制.prj并重命名。因此,例如,如果您有3个shapefile:

  • 一.shp,
  • two.shp,
  • 三马力。

定义one.shp的投影,目录中将有one.prj。将one.prj复制到two.shp目录,然后重命名为two.prj,对所有shapefile重复此操作。.prj只是一个文本文件。只要在与.shp相同的目录中有一个.prj并具有相同的名称,软件就会将其选中。使用您熟悉的用于复制和重命名文件的任何工具实现自动化。


4

编辑:

最简单的方法可能就是。将它们全部放入并为文档分配正确的cr。它们将是“未投影的”,但位于正确的位置。然后只需导出(多个)到新位置。

我确实看到了用于批处理投影的GP工具。

批处理项目

它可能不会在arcpy中暴露。??

我想我会创建一个pgdb(文件,个人甚至sde),然后创建一个fds(功能数据集)。

为该fds分配适当的crs。

导入形状文件(多个)。[fds中的所有fc都继承了fds的crs]。

然后,您可以导出到形状文件(多个)。

这将代替批量投影,我敢肯定可以编写脚本。


尽管此方法确实有效,但所需时间比Ryan Dalton建议的时间长得多。将100多个形状文件导入要素类非常慢。
2011年


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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.