ArcMapで複数のシェープファイルの投影を定義しますか?


29

.prjファイルを持たない100以上のシェープファイルがあるため、ArcMap 10に取り込むと、座標系が不明として表示されます。すべてのシェイプファイルの座標系がGCS WGS 1984であることを知っています。また、Define Projection 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)

しかし、マルチラスターファイルの投影を定義する場合、どうすればよいですか?

回答:


29

皆さんはこれを考え過ぎていると思います...

  1. ツールボックスの[投影の定義]ツールを右クリックし、
  2. 「バッチ」を選択し、
  3. レイヤーを[入力データセット]列にドラッグアンドドロップし、
  4. 最初の「座標系」ボックスを右クリックして、正しい投影法を入力し、
  5. 次に、先ほど選択した投影を右クリックして、[Fill]を選択します。これにより、残りの投影がすべて入力されます。
  6. [OK]を押すと完了です。

代替テキスト


それは実際にOSフォルダーにShapefile .PRJヘルパーファイルを生成しますか、それとも単にレイヤー属性に注釈を付けますか?また、ArcGISも起動する必要があります。Jayが作成したPythonスクリプトは、ArcGISの外部で完全に動作し、特定の結果をもたらします。これは、ESRI以外のニーズに適しています。
Vスチュアートフット

はい、「Define Projection」ツールは、処理されるすべてのシェープファイルのPRJファイルを書き込みます。Jayが投稿したPythonスクリプトはおそらくうまく機能することに同意しますが、スクリプティングは一般的なGISスペシャリストのスキルセットの範囲外である場合がありますが、プッシュボタン「Define Projection」ユーティリティはそうではありません。
ライアンダルトン

1
Ryanに感謝します。GPツールを右クリックしてオプションを追加できるとは考えていません。それはいいトリックで、まさに私が探していたものでした。とても有難い。
ウィルベフ

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」名でエラーが発生しています。以下のエラーメッセージに貼り付けました。何が間違っているのでしょうか?
ウィルベフ

エラーを貼り付ける前に追加されて申し訳ありませんが、ここにあります:ランタイムエラー<type 'exceptions.NameError'>:名前 'os'は定義されていません
-wilbev

おっと...インポートが役立ちます!:( import os, shutil 更新された回答を参照)。 docs.python.org/tutorial/stdlib.htmlがあります。
ジェイカミンズ

9

.prjのコピーを作成して名前を変更するだけです。したがって、たとえば、3つのシェープファイルがある場合:

  • one.shp、
  • two.shp、
  • three.shp。

one.shpのプロジェクションを定義すると、ディレクトリにone.prjが作成されます。one.prjをtwo.shpのディレクトリにコピーし、two.prjに名前を変更し、すべてのシェープファイルについて繰り返します。.prjは単なるテキストファイルです。.shpと同じディレクトリに同じ名前の.prjがある限り、ソフトウェアはそれを取得します。ファイルをコピーして名前を変更するための使い慣れたツールで自動化します。


4

編集:

おそらく最も簡単な方法でしょう。それらをすべて取り込み、ドキュメントに正しいcrsを割り当てます。それらは「投影されていない」が、適切な場所に座っている。次に、新しい場所にエクスポート(複数)します。

バッチ投影用のGPツールがあります。

バッチプロジェクト

arcpyでは公開されない場合があります。?

pgdb(ファイル、個人、またはsde)を作成し、次にfds(機能データセット)を作成すると思います。

適切なcrsをそのfdsに割り当てます。

形状ファイルをインポートします(複数)。[fdsのすべてのfcはfdsのcrsを継承します]。

その後、シェープファイル(複数)にエクスポートできます。

これはバッチ投影の代わりになり、スクリプトを作成できると確信しています。


この方法は機能しますが、Ryan Daltonが提案したよりもはるかに時間がかかります。フィーチャクラスへの100以上のシェープファイルのインポートは非​​常に遅くなります。
ウィルベフ


1

ここに私が使用するものがあります...それは投影を持たないラスタファイルの投影のみを定義します。それが役に立てば幸い。また、品質保証の目的で、プロジェクションなしでファイルのリストを作成します。

ベクターの場合、わずかなmodが必要です-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.