我希望有一个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
抱歉,我在粘贴错误之前添加了错误,这里是:运行时错误
–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)
评论
但是,如果要为多栅格文件定义投影,该怎么办?