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


评论

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

#1 楼

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


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



评论


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

–V Stuart Foote
2011年1月7日23:26

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

– RyanKDalton
2011年1月7日在23:52



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

–wilbev
2011年1月8日,下午1:47

#2 楼

如果它们在同一目录中,则将可以执行以下操作(只需替换路径,也许可以添加一些异常处理即可):

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年1月8日在1:49

抱歉,我在粘贴错误之前添加了错误,这里是:运行时错误:未定义名称'os'

–wilbev
2011年1月8日,1:50

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

–杰伊·康明斯(Jay Cummins)
2011年1月8日在1:52



#3 楼

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


one.shp,
two.shp,
three.shp。

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

#4 楼

编辑:

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

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



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

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

将适当的crs分配给该fds。

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

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

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

评论


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

–wilbev
2011年1月8日,下午1:51

#5 楼

一个简单的shell脚本和ogr2ogr怎么样?有关确切的语法,请参见http://www.gdal.org/ogr2ogr.html。

#6 楼

这就是我使用的...它只会为没有投影的栅格文件定义投影。希望能帮助到你。它还出于质量保证的目的创建了一个没有投影的文件列表。

对于您的矢量,它只需要稍微修改一下-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)