ユーザーが選択できる関連ポイント、ライン、またはポリゴンを含むさまざまな土地利用情報をユーザーが入力できるAccessデータベース(MS Access 2010)があり、データベースはプロジェクトの一部としてマスタージオデータベースに読み込まれます。ユーザーがArcMapでフィーチャを表示できるようにします。Arc 9.3では、これはすべてVBAで実現され、うまく機能しました。Arc 10へのアップグレードにより、VBAはオプションではなくなり、Pythonでプログラミングし、シェル機能を使用してAccessからコマンドを呼び出す方法を学習しました。ユーザーが現在のArcMapドキュメントに機能を追加できるようにする機能を除いて、ほぼすべて完了しました。発生するはずの手順は次のとおりです。
1)ユーザーは、関心のある機能を識別するAccessプログラムのボタンをクリックします。
2)Accessは、正しいmxdが開いているかどうかを判断し、開いていない場合はそれを開きます(通常、ドキュメントは開いているため、この手順は不要です)。
3)Pythonスクリプトは、Pythonシェルコマンドを使用して開き、正しい開いているmxdを識別し、開いているArcMapドキュメントに機能を追加します。
私はarcpyとArcObjectsの両方を試しました。開いているマップ内でarcpyを実行できますが、MS AccessでVBAを介してPythonファイルを開いても、開いているmxdを操作できません。ESRIフォーラムから、ArcObjectsを使用するよう提案されました。対象のArcMapドキュメントに既にロードされているレイヤーを特定して操作するためのコードを見つけて使用しましたが、新しいレイヤーを特定して追加する方法に完全に行き詰まっています。これがこれまでのコードですが、コードの最後のセクションでレイヤーファイルを正しく識別できれば機能すると思います。少なくとも、コードの下部にあるpMap.AddLayer(FC)なしですべて実行されますが、私は生態学者であり、トレーニングを行うプログラマーではないため、他に何か不足している可能性があります。任意の助けいただければ幸いです。
更新:私は今とても近くにいます。ジオデータベースでフィーチャを識別できますが、マップにデータを追加しようとするとArcMapがクラッシュし、次のエラーが発生します:COMError:(-2147467259、 'Unspecified error'、(None、None、None、0、None)) 。ただし、私の出力は正しい機能を識別しているように見えます。ArcMapがクラッシュする理由がわかりません。助けてください、私はとても近いです。
import arcpy
from arcpy import env
import os
import sys
import comtypes.gen.esriArcMapUI as esriArcMapUI
import comtypes.gen.esriCarto as esriCarto
import comtypes.gen.esriGeoDatabase as esriGeoDatabase
import comtypes.gen.esriFramework as esriFramework
import comtypes.gen.esriSystem as esriSystem
import comtypes.gen.esriDataSourcesFile as DataSourcesFile
#Eventaully these will be the arguments that call the feature
#test = sys.argv[0]
#Name = sys.argv[1]
#Alias = sys.argv[2]
def NewObj(MyClass, MyInterface):
from comtypes.client import CreateObject
try:
ptr = CreateObject(MyClass, interface=MyInterface)
return ptr
except:
return None
def CType(obj, interface):
try:
newobj = obj.QueryInterface(interface)
return newobj
except:
return None
def GetApp():
"""Get a hook into the current session of ArcMap"""
#from comtypes.gen import esriFramework
pAppROT = NewObj(esriFramework.AppROT, esriFramework.IAppROT)
if pAppROT is not None:
iCount = pAppROT.Count
if iCount == 0:
print 'No ArcGIS application currently running. Terminating ...'
return None
for i in range(iCount):
pApp = pAppROT.Item(i) #returns IApplication on AppRef
print pApp.Name
if pApp.Name == 'ArcMap':
print "ArcMap found"
pDoc = pApp.Document
print pDoc.Title
if pDoc.Title == "CreateShapefile10x.mxd" or pDoc.Title == "CreateShapefile10x":
return pApp
print 'No ArcMap session is running at this time.'
print "No AppROT found"
print "Failed"
return None
pApp = GetApp()
try:
pDoc = pApp.Document
pMxDoc = CType(pDoc, esriArcMapUI.IMxDocument)
pMap = pMxDoc.FocusMap
if pMap.Name == "LTDL Layers":
###New Code###
sPath = r"Y:\LTDL_Data\LTDL_Files\Abate_Seeding_1965\Abate_Seeding_1965.gdb"
sPath1 = r"Abate_Seeding_1965"
pWSF = NewObj(esriDataSourcesGDB.FileGDBWorkspaceFactory, esriGeoDatabase.IWorkspaceFactory)
print pWSF
pWS = pWSF.OpenFromFile(sPath, 0)
pDS = CType(pWS, esriGeoDatabase.IDataset)
print "Workspace name: " + pDS.BrowseName
print "Workspace category: " + pDS.Category
FWSS = CType(pWS, esriGeoDatabase.IFeatureWorkspace)
FL = NewObj(esriCarto.FeatureLayer, esriCarto.IFeatureLayer)
FL.FeatureClass = FWSS.OpenFeatureClass(sPath1)
print FL
print FL.FeatureClass.AliasName
LAN = CType(FL, esriCarto.ILayer)
LAN.Name = FL.FeatureClass.AliasName + ": Project Boundary"
print LAN.Name
###New Code###
pMap.AddLayer(FC)
pLayout = pMxDoc.PageLayout
pActiveView = CType(pLayout, esriCarto.IActiveView)
pActiveView.Refresh()
pMxDoc.UpdateContents
print "Done"
except:
print "Failed"