Saya memiliki database Access (MS Access 2010) yang memungkinkan pengguna untuk memasukkan berbagai informasi pengolahan lahan termasuk titik terkait, garis, atau poligon yang dapat dipilih pengguna dan database kemudian akan dimuat sebagai bagian dari proyek, ke master geodatabase, dan memungkinkan pengguna untuk melihat fitur-fitur dalam ArcMap. Di Arc 9.3 ini semua dilakukan dengan VBA dan bekerja dengan baik. Karena peningkatan ke Arc 10, VBA tidak lagi menjadi pilihan dan saya telah belajar cara memprogram dalam python dan memanggil perintah melalui Access menggunakan fitur Shell. Saya hampir menyelesaikan semuanya kecuali untuk memungkinkan pengguna untuk menambahkan fitur mereka ke dokumen ArcMap saat ini. Berikut langkah-langkah yang harus dilakukan.
1) Pengguna mengklik tombol dalam program Access yang mengidentifikasi fitur yang diminati.
2) Akses menentukan apakah mxd yang benar terbuka dan jika tidak membukanya (dokumen biasanya terbuka sehingga langkah ini sering tidak perlu)
3) Skrip Python terbuka menggunakan perintah Python shell, mengidentifikasi mxd yang benar dan terbuka, dan menambahkan fitur ke dokumen ArcMap terbuka
Saya telah mencoba keduanya arcpy dan ArcObjects. Saya dapat menjalankan arcpy di peta terbuka tetapi membuka file Python melalui VBA di MS Access tidak memanipulasi mxd terbuka. Forum ESRI menyarankan agar saya bekerja dengan ArcObjects. Saya telah menemukan dan menggunakan kode untuk mengidentifikasi dan memanipulasi lapisan yang sudah dimuat dalam dokumen ArcMap yang menarik tetapi saya benar-benar terjebak pada bagaimana mengidentifikasi dan menambahkan lapisan baru. Berikut adalah kode sejauh ini, saya pikir ini akan berfungsi jika saya dapat dengan benar mengidentifikasi file layer di bagian terakhir dari kode. Setidaknya semuanya berjalan tanpa pMap.AddLayer (FC) di dekat bagian bawah kode, tapi saya seorang ahli ekologi dan bukan programmer dengan pelatihan sehingga mungkin ada hal lain yang saya lewatkan. Bantuan apa pun akan dihargai.
Pembaruan: Saya sekarang sangat dekat. Saya dapat mengidentifikasi fitur dalam geodatabase tetapi sekarang ArcMap lumpuh ketika mencoba menambahkan data ke peta dan saya menghasilkan kesalahan: COMError: (-2147467259, 'Kesalahan tidak ditentukan', (Tidak Ada, Tidak Ada, Tidak ada, 0, Tidak Ada) . Namun, output saya muncul untuk mengidentifikasi fitur yang benar. Saya tidak yakin mengapa ArcMap mogok. Tolong bantu, saya sangat dekat.
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"
sumber
Jawaban:
Anda menambahkan layer "FC" ke peta Anda yang seharusnya "FL" atau "LAN". Baik layer fitur atau layer seharusnya berfungsi.
Perlu diketahui bahwa peta mungkin dalam tampilan data, bukan tampilan tata letak dalam hal ini pMxDoc.PageLayout salah ... Saya tidak bisa mengatakan apa itu pLayout karena tidak ditentukan dalam blok kode.
Akan lebih aman menggunakan IMXDocument.FocusMap karena ini bisa berupa tata letak tipe atau tampilan data.
dengan asumsi pApp adalah IApplication:
Saya biasanya melakukannya pada tiga baris sehingga tidak membingungkan bagi pembaca.
ps Saya pribadi lebih suka meredupkan objek, membuatnya lebih mudah untuk mengetahui apa yang terjadi:
Dengan begitu pembaca mengetahui dengan pasti apa masing-masing objek itu.
sumber
NameError
saja.