You are on page 1of 51

GIS and Engineering

• Mark Pearson, PE (civil)


• GeoNorth, LLC
– GIS, Database, Internet Consulting
– Anchorage, Portland
– 13 Years Old (91 DOGS Years)
– App Development, Planning, Conversion
– Huge to Tiny Projects/Organizations

www.geonorth.com
Value Through Integration and Innovation
The Plan

• ArcObjects
– Concepts
– Examples
• Python
– Concepts
– Examples
• Compare/Contrast
• Discussion

www.geonorth.com
Value Through Integration and Innovation
Multiple Ways to Skin the Cat

www.geonorth.com
Value Through Integration and Innovation
ArcObjects: Serious Programming

• AML
– Throw commands into text file and you’re a
programmer
• Avenue
– Proprietary Language

www.geonorth.com
Value Through Integration and Innovation
www.geonorth.com
Value Through Integration and Innovation
ArcObjects

• Not a Language
• Building Blocks Upon
which ArcGIS was built
• COM objects
• Most commonly used
with VisualBasic or
C++

www.geonorth.com
Value Through Integration and Innovation
ArcObjects: First Rule

Whining

www.geonorth.com
Value Through Integration and Innovation
VisualBasic

www.geonorth.com
Value Through Integration and Innovation
Modeling the Real World

• Objects

www.geonorth.com
Value Through Integration and Innovation
Object Oriented

Map Car
Property MapUnits Horsepower
Method AddLayer Accelerate
Event SelectionChanged Brakes are
pressed
www.geonorth.com
Value Through Integration and Innovation
Object Orientation

• Properties
– Characteristics (nouns)
• Methods
– Actions object knows how to perform (verbs)
• Events
– Occurrences that Object can respond to

www.geonorth.com
Value Through Integration and Innovation
Objects Vs. Classes

www.geonorth.com
Value Through Integration and Innovation
Objects Vs. Classes

• Class is the “Blueprint”


• Object is the “House”
– An instantiation

www.geonorth.com
Value Through Integration and Innovation
Interface vs. Objects

www.geonorth.com
Value Through Integration and Innovation
Interfaces vs. Objects

Dim pFeatureLayer As IFeatureLayer


Dim pAttributeTable as IAttributeTable
Set pFeatureLayer = new FeatureLayer
Set pAttributeTable = pFeatureLayer ‘Query Interface
www.geonorth.com
Value Through Integration and Innovation
Tips

• Learn all of the on-line resources and use them

arcobjectsonline.esri.com
www.geonorth.com
Value Through Integration and Innovation
Tips

• Use Samples
– Lots of Them
– Almost Never Start from Scratch

www.geonorth.com
Value Through Integration and Innovation
Tips

• Training is Worth It for quick jump start


• We have an ArcObjects course in March
(hint)

www.geonorth.com
Value Through Integration and Innovation
Tips

• Spend Time on Error Handling

www.geonorth.com
Value Through Integration and Innovation
ArcObjects

• For hard-core programmers = Nirvana


• For casual programmers = Purgatory
• Non programmers = Hell

www.geonorth.com
Value Through Integration and Innovation
ArcObjects: Before & After

Before ArcObjects After ArcObjects

www.geonorth.com
Value Through Integration and Innovation
ArcObjects

• Up Side: Granularity of Control


• Down Side: Nothing is Easy*

* For the casual user

www.geonorth.com
Value Through Integration and Innovation
Common Implementations

• Quick & Dirty Automation using VBA within


ArcMap
• Separate stand-alone applications
• ‘Extensions’ to ArcGIS framework
– Compiled DLL(s)

www.geonorth.com
Value Through Integration and Innovation
Example in ArcObjects

• Example: Programmatically Turn a Layer Off

www.geonorth.com
Value Through Integration and Innovation
Private Sub TurnOffLayer()
Dim pDoc As IMxDocument
Dim pMap As IMap
Dim pLayer As ILayer

Dim pActiveView As IActiveView

Set pDoc = ThisDocument


Set pMap = pDoc.FocusMap

Set pLayer =

www.geonorth.com
Value Through Integration and Innovation
Private Function FindLayerByName(strLayerName As String, pMap As IMap) As ILayer
Dim i As Integer
For i = 0 To pMap.LayerCount - 1
If UCase(pMap.Layer(i).Name) = UCase(strLayerName) Then
Set FindLayerByName = pMap.Layer(i)
Exit Function
End If
Next i
Set FindLayerByName = Null

End Function

www.geonorth.com
Value Through Integration and Innovation
Private Sub TurnOffLayer()
Dim pDoc As IMxDocument
Dim pMap As IMap
Dim pLayer As ILayer

Dim pActiveView As IActiveView

Set pDoc = ThisDocument


Set pMap = pDoc.FocusMap

Set pLayer = FindLayerByName("parcels", pMap)


pLayer.Visible = False

Set pActiveView = pMap ‘this is a query interface


pActiveView.Refresh
pActiveView.ContentsChanged

End Sub
www.geonorth.com
Value Through Integration and Innovation
ArcObjects 8.x to 9.0

• Good News: not much pain


• Binary Compatibility for most core-level
libraries
• Not like Avenue versus ArcObjects

www.geonorth.com
Value Through Integration and Innovation
Type Libraries: Diced Up

• Esricore.olb was one huge library


• Now slit into functional groups

www.geonorth.com
Value Through Integration and Innovation
Type Libraries: Diced Up

ArcObjects 8.x ArcObjects 9.0

Declarations
Dim pEnv as esriCore.IEnvelope Dim pEnv as esriGeometry.IEnvelope
ZoomToPoint (inPt as esricore.IPoint) ZoomToPoint(inPt As esriGeometry.IPoint)

Instantiations
Set pPt = new esriCore.Point set pPt = New esriGeometry.Point

Implementations
Implements esricore.ITool Implements esriFramework.ITool

www.geonorth.com
Value Through Integration and Innovation
ArcGIS 9.0 Type Libraries
ArcGIS Engine UI ArcGIS Engine
•esriSystemUI esriSystem
•esriDisplayUI esriGeometry
•esriOutputUI esriDisplay
•esriGeoDatabaseUI esriOutput
•esriDataSourcesRasterUI esriGeoDatabase
•esriLocationUI esriDataSourcesFile
•esriCartoUI esriDataSourcesGDB
•esriCadUI esriDataSourcesOleDB
•esriIMSUI esriDataSourcesRaster
•esriTinUI esriGeoDatabaseDistributed
•esriCatalogUI esriLocation
esriCarto
ArcGIS Application assemblies esriCad
•esriArcMapUI esriIMS
•esriArcMap esriTin
•esriArcCatalogUI esriWorker
•esriArcCatalog esriFramework
•esriEditor
•esriEditorExt
•esriGeoDatabaseDistributedUI
•esriGeoReferenceUI
www.geonorth.com
Value Through Integration and Innovation
Code Converter Utility

• VB6 Add-In
• Removes ESRI Object Library from Project
reference
• Replaces ‘esriCore.’ with appropriate name in:
• Declarations
• Instantiations
• Implementations
• ProgIDs
• Adds appropriate new references according code
that is found

www.geonorth.com
Value Through Integration and Innovation
Tips for Healthy ArcObjects Use

• Never over promise amount of time


• Always plagiarize Code
• ArcObjects Online / Samples
• Knowledgebase
• Your own code
• Keep a ‘Toolbox’ of common routines
• Make subs/functions generic whenever you can

www.geonorth.com
Value Through Integration and Innovation
• Python/Scripting

www.geonorth.com
Value Through Integration and Innovation
Scripting in ArcGIS

• Python
• VBScript
• Perl
• Jscript
• Any scripting language that is COM
compliant
• Python is ESRI-prefered

www.geonorth.com
Value Through Integration and Innovation
Why Python?

• Easy to learn, clean, clear syntax


• Supports Object Oriented programming
• Works well with complicated data structures
• Simple to integrate with C++ and Fortram
• Can be seamlessly integrated with Java
• Free, Open Source, Widely Used

www.geonorth.com
Value Through Integration and Innovation
Python

• Not invented by ESRI


• Interpreted, interactive, object-oriented
• Invented in 1991 by Guido von Rossum,
Netherlands
• Named after Monty Python
• www.python.org
• Platforms: Windows, all UNIX, OS/2, Mac,
Amiga – even Nokia cell phones

www.geonorth.com
Value Through Integration and Innovation
Geoprocessing with Python

• Geoprocessor Programming Model

www.geonorth.com
Value Through Integration and Innovation
Scripts in ArcToolBox

www.geonorth.com
Value Through Integration and Innovation
Importing Modules

• Python scripts are Modules


• Use the ‘import’ statement to load and use
modules
• All geoprocessing scripts use the ‘win32com’
module
– Supports communciation between Python and
the COM IDispatch interface, which is used by
the geoprocessor
• Other modules to math, file I/O, OS stuff,
etc.

www.geonorth.com
Value Through Integration and Innovation
Standard Stuff at in a Python Script

import win32com.client, sys, os


– sys is python system, user input, etc.
– Os does OS-specific file manipulation

#Create the Geoprocessor object


GP = win32com.client.Dispatch("esriGeoprocessing.GpDispatch.1")
– Declares and creates geoprocessing object that you will use later

#Set the input workspace


GP.workspace = “c:\data\anchorage\shapes”
GP.workspace = sys.argv[1]

www.geonorth.com
Value Through Integration and Innovation
Indentation and Spaces

• They are relevant!

try:

#get a list of featureclasses in workspace


fcs = GP.ListFeatureClasses()

Python is also case sensitive !!!


gp is not the same as GP

www.geonorth.com
Value Through Integration and Innovation
Batch Processing

• ListDatasets (Wild Card, Dataset Type)


• ListFeatureClasses (Wild Card, Feature Type)
• ListFields (Input Value, Wild Card, Field Type)
• ListIndexes (Input Value, Wild Card)
• ListRasters (Wild Card, Raster Type)
• ListTables (Wild Card, Table Type)
• ListWorkspaces (Wild Card, Workspace Type)

• All return an Enumeration (list with unknown count)

www.geonorth.com
Value Through Integration and Innovation
Batch Example
# Import COM Dispatch module
from win32com.client import Dispatch
# Create the geoprocessor object
GP = Dispatch("esriGeoprocessing.GPDispatch.1")
# Set the workspace. List all of the feature classes that start with 'G'
GP.Workspace = “c:/data/anchorage/anch.mdb”
fcs = GP.ListFeatureClasses("G*")
# or for a type: fcs = GP.ListFeatureClasses("G*","polygon")

www.geonorth.com
Value Through Integration and Innovation
Batch Example
# Reset the enumeration to make sure the first object is returned
fcs.reset()
# Get the first feature class name
fc = fcs.next()
while fc: # While the feature class name is not None
# Copy the features from the workspace to a folder
GP.Copy(fc,“c:\data\anchorage\dataout\” + fc)
# Get the next feature class name
fc = fcs.next()

www.geonorth.com
Value Through Integration and Innovation
Licensing

• When a tool is executed, either thru the


ArcToolbox or thru Script, an ArcGIS
Desktop license is required
• Extension Licenses, too

www.geonorth.com
Value Through Integration and Innovation
Extending Python with Wrappers

• Vector Formats
– pyshapelib (shapelib.maptools.org)
• Access to individual vertices of the shape
• Dbf file
• Indexing
– OGR (gdal.maptools.org/ogr)
• Other vector formats like MapInfo, Coverage,
PostGIS, Oracle Spatial, TIGER, SDTS, OpeNDAP,
DGN, Microstation DGN

www.geonorth.com
Value Through Integration and Innovation
Extending Python with Wrappers

• Grids
– Geodata Abstration Library GDAL
(gdal.maptools.org)
• JPEG2000, BSP, USGS DEM, Military
• Elevation Data, ECW, GRASS, TIFF/GeoTIFF,
NetCDF, Imagine, and SDTS

www.geonorth.com
Value Through Integration and Innovation
Extending Python with Wrappers

• Projections
– pyProjection
(http://hobu.biz/index_html/software/pyprojection)
• For projecting coordinates from one to another
• Uses EPSG code system and/or you can roll your own
• SDE
– PySDE (hobu.stat.aistate.edu/pysde)
• Wrapper for SDE C API and has corresponding Python
methods

www.geonorth.com
Value Through Integration and Innovation
ArcObjects or Python?

• Rearrange the ArcGIS User Interface?


• Batch project a bunch of feature classes?
• Create new tool to edit special Widget
feature classes?
• Create an ‘Extension’ for ArcGIS?
• Automated Map Book Generation

www.geonorth.com
Value Through Integration and Innovation
Thanks

www.geonorth.com
Value Through Integration and Innovation