[[ArcGIS]] *ArcPy(ArcGIS10)に関する覚書 [#x4f227e3] **ワイルドカードを用いて複数ファイルを指定する [#n467ab7f] マージなどの複数のデータを入力する処理を行う際に ワイルドカードを用いてファイルを指定する手順~ >&color(red){'''# globモジュールをインポートする'''}; >import glob~ >&color(red){'''# 出力ファイルのパスと名前を指定'''}; >outputdata = "C:\\temp\\ps_merge_all.shp"~ >&color(red){'''# ワイルドカードを使用して入力データリストを指定'''}; >files = glob.glob('C:\\temp\\*.shp')~ >&color(red){'''# Process: マージ (Merge)'''}; >arcpy.Merge_management(files, outputdata)~ **河口から流路延長1kmごとにポイントを発生させる処理 [#lb649f13] あまり美しくないですが・・ あと大学じゃないと(=arcinfoがないと)できません &color(red){'''# Set the necessary product code'''};~ &color(red){'''# import arcinfo'''};~ &color(red){'''# Import arcpy module'''};~ import arcpy~ &color(red){'''# 必要なエクステンションの指定'''};~ arcpy.CheckOutExtension("Network")~ &color(red){'''# 河口のポイントデータ(test_shisetsu)とネットワークデータセット(test02_ND)を指定する'''};~ &color(red){'''# Local variables:'''};~ test_shisetsu = "C:\\temp\\test.mdb\\test_shisetsu"~ test02_ND = "C\\temp\\test.mdb\\test02\\test02_ND"~ &color(red){'''# ワークスペースの指定'''};~ tempWorkspace = "C:\\temp\\temp"~ outputWorkspace = "C:\\temp\\fin"~ &color(red){'''#変数xを1000から100000まで1000間隔で繰り返し処理する'''};~ try: >for x in range(1000, 101000, 1000): >>&color(red){'''#変数の宣言'''}; >>&color(red){'''#ネットワーク解析レイヤの名前'''}; >>fc = "reach" + str(x)[:-3] >>&color(red){'''#河口からの距離の変数'''}; >>mkyori = str(x) >>&color(red){'''#ネットワーク解析レイヤからラインデータを抽出'''}; >>line_l = "reach" + str(x)[:-3] + "\\ライン" >>&color(red){'''#ポイントデータのファイル名'''}; >>output1 = tempWorkspace + "\\p_" + str(x)[:-3] + ".shp" >>&color(red){'''#ポイントデータをレイヤに変換する際の名前'''}; >>layer1 = str(x)[:-3] + "L" >>&color(red){'''#ポイントデータからデータを抽出する際の条件式'''}; >>formula1 = "\"ToCumul_k\" =" + str(x) >>&color(red){'''#最終的なポイントデータのファイル名'''}; >>output2 = outputWorkspace + "\\ps_" + str(x)[:-3] + ".shp" >>&color(red){'''# Process: 到達圏レイヤの作成 (Make Service Area Layer)'''}; >>arcpy.MakeServiceAreaLayer_na(test02_ND, fc, "k", "TRAVEL_FROM", mkyori, "NO_POLYS", "NO_MERGE", "RINGS", "TRUE_LINES", "OVERLAP", "NO_SPLIT", "", "k", "ALLOW_UTURNS", "", "TRIM_POLYS", "100 Meters", "NO_LINES_SOURCE_FIELDS") >>&color(red){'''# Process: ロケーションの追加 (Add Locations)'''}; >>arcpy.AddLocations_na(fc, "施設", test_shisetsu, "Name # #;CurbApproach # 0;Attr_k # 0;Breaks_k # #", "5000 Meters", "", "a SHAPE;test02_ND_Junctions NONE", "MATCH_TO_CLOSEST", "APPEND", "NO_SNAP", "5 Meters", "INCLUDE", "a #;test02_ND_Junctions #") >>&color(red){'''# Process: 解析の実行 (Solve)'''}; >>arcpy.Solve_na(fc, "SKIP", "TERMINATE") >>&color(red){'''# Process: フィーチャの頂点 → ポイント (Feature Vertices To Points)←抽出した河川区間の最上流部と最下流部にのみポイントを発生させる処理'''}; >>arcpy.FeatureVerticesToPoints_management(line_l, output1, "DANGLE") >>&color(red){'''# Process: フィーチャ レイヤの作成 (Make Feature Layer)←ぴったり1km間隔で発生したポイントのみをレイヤとして抽出する処理'''}; >>arcpy.MakeFeatureLayer_management(output1, layer1, formula1, "", "FID FID VISIBLE NONE;Shape Shape VISIBLE NONE;FacilityID FacilityID VISIBLE NONE;FromCumul_ FromCumul_ VISIBLE NONE;ToCumul_k ToCumul_k VISIBLE NONE;ORIG_FID ORIG_FID VISIBLE NONE;DANGLE_LEN DANGLE_LEN VISIBLE NONE") >>&color(red){'''# Process: フィーチャのコピー (Copy Features)←抽出したレイヤをフィーチャクラスに変換する処理'''}; >>arcpy.CopyFeatures_management(layer1, output2, "", "0", "0", "0") >>print mkyori except: >print "error" **NetworkAnalystのサービスエリア解析利用して得られた結果にIDを振ってまとめる処理[#kcf8c4c3] **NetworkAnalystのサービスエリア解析で得られた結果にIDを振ってまとめる処理[#kcf8c4c3] (特定の方向けに作ったので意味不明だと思いますが・・)~ やはりあまり美しくないですね・・ # Import arcpy module~ import arcpy # Import glob module~ import glob # Local variables:~ sectiondata = "D:\\temp\\section.shp" # temporary workspace~ tempWorkspace = "D:\\temp\\temp"~ results = "D:\\temp\\results"~ try: for x in range(0, 11000, 1000): #変数の宣言 plus = int(x) + 1000 plusstr = str(plus) mkyori = str(x) layer1 = str(x)[:-3] + "L" formula1 = "\"ToCumul_di\">" + str(x) + "AND" + "\"ToCumul_di\"<=" + plusstr output1 = tempWorkspace + "\\sec_" + str(x)[:-3] + ".shp" output2 = results + "\\sec_" + str(x)[:-3] + "_with_att.shp" bufoutput1 = tempWorkspace + "\\buf_" + str(x)[:-3] + "_sec.shp" bufoutput2 = tempWorkspace + "\\buf_" + str(x)[:-3] + "_sec_s.shp" buflayer = str(x)[:-3] + "BL" buflayer2 = buflayer buflayer3 = buflayer buflayer4 = buflayer buflayer5 = buflayer parameter = "OBJECTID \"OBJECTID\" true true false 9 Long 0 9 ,First,#," + output1 + ",OBJECTID,-1,-1;FacilityID \"FacilityID\" true true false 9 Long 0 9 ,First,#," + output1 + ",FacilityID,-1,-1;FromCumul_ \"FromCumul_\" true true false 19 Double 0 0 ,First,#," + output1 + ",FromCumul_,-1,-1;ToCumul_di \"ToCumul_di\" true true false 19 Double 0 0 ,First,#," + output1 + ",ToCumul_di,-1,-1;Shape_Leng \"Shape_Leng\" true true false 19 Double 0 0 ,First,#," + output1 + ",Shape_Leng,-1,-1;dist_sec \"dist_sec\" true true false 0 Long 0 0 ,First,#," + bufoutput2+ ",dist_sec,-1,-1;id_sec \"id_sec\" true true false 0 Long 0 0 ,First,#," + bufoutput2 + ",id_sec,-1,-1" # Process: フィーチャ レイヤの作成 (Make Feature Layer) arcpy.MakeFeatureLayer_management(sectiondata, layer1, formula1, "", "FID FID VISIBLE NONE;Shape Shape VISIBLE NONE;FacilityID FacilityID VISIBLE NONE;FromCumul_ FromCumul_ VISIBLE NONE;ToCumul_k ToCumul_k VISIBLE NONE;ORIG_FID ORIG_FID VISIBLE NONE;DANGLE_LEN DANGLE_LEN VISIBLE NONE") # Process: フィーチャのコピー (Copy Features) arcpy.CopyFeatures_management(layer1, output1, "", "0", "0", "0") # Process: バッファ(Buffer) arcpy.Buffer_analysis(layer1, bufoutput1, "0.1 Meters", "FULL", "ROUND", "ALL", "") # Process: マルチパート → シングルパート(Multipart To Singlepart) arcpy.MultipartToSinglepart_management(bufoutput1, bufoutput2) # Process: フィーチャ レイヤの作成(Make Feature Layer)その2 arcpy.MakeFeatureLayer_management(bufoutput2, buflayer, "", "", "FID FID VISIBLE NONE;Shape Shape VISIBLE NONE;OBJECTID OBJECTID VISIBLE NONE;FacilityID FacilityID VISIBLE NONE;FromCumul_ FromCumul_ VISIBLE NONE;ToCumul_di ToCumul_di VISIBLE NONE;Shape_Leng Shape_Leng VISIBLE NONE;id_section id_section VISIBLE NONE;BUFF_DIST BUFF_DIST VISIBLE NONE;ORIG_FID ORIG_FID VISIBLE NONE") # Process: フィールドの追加(Add Field) arcpy.AddField_management(buflayer, "dist_sec", "LONG", "", "", "", "", "NON_NULLABLE", "NON_REQUIRED", "") # Process: フィールドの追加(Add Field) その2 arcpy.AddField_management(buflayer2, "id_sec", "LONG", "", "", "", "", "NON_NULLABLE", "NON_REQUIRED", "") # Process: フィールド演算(Calculate Field) arcpy.CalculateField_management(buflayer3, "dist_sec", mkyori, "VB", "") # Process: フィールド演算(Calculate Field)その2 arcpy.CalculateField_management(buflayer4, "id_sec", "[FID]+1", "VB", "") # Process: 空間結合(Spatial Join) arcpy.SpatialJoin_analysis(output1, bufoutput2, output2, "JOIN_ONE_TO_ONE", "KEEP_COMMON", parameter, "WITHIN", "", "") print mkyori except: print "error" # 出力ファイルの指定~ Moutput = results + "\\hokk_all_section.shp"~ Doutput = results + "\\hokk_all_section_dissolve.shp"~ # ワイルドカードを使用して入力データリストを指定~ filelist = results + "\\sec_*.shp"~ files = glob.glob(filelist)~ # Process: マージ (Merge)~ arcpy.Merge_management(files, Moutput)~ # Process: ディゾルブ(Dissolve)~ arcpy.Dissolve_management(Moutput, Doutput, "FacilityID;dist_sec;id_sec", "FromCumul_ MIN;ToCumul_di MAX", "MULTI_PART", "DISSOLVE_LINES")~ print "finish"