Title: Programming for Geographical Information Analysis: Advanced Skills
1Programming for Geographical Information
AnalysisAdvanced Skills
- Lecture 3 Arc Data Framework
- Dr Andy Evans
2- Data
- Getting maps and layers
- Getting data points and attributes
- Sorting and searching
3ArcMap IMXDocument methods
- Used for getting data
- getActiveView() i.e. layout view or data view
data. - getFocusMap() i.e. currently selected/shown
map. - getMaps() i.e. all maps.
- getSelectedItem() i.e. that the user has picked.
- getSelectedLayer() i.e. that the user has picked.
- Documents also implement IDocument, the main use
of which is programmatically controlling toolbars.
4- Data
- Getting maps and layers
- Getting data points and attributes
- Sorting and searching
5Getting data
Document (.mxd file)
Map
AttributeTable
FID Data
1 234
2 875
Layer
Feature
234
Values
6Getting a Map
- A Map contains all the data and features in the
Data View or each Layout View frame. - import com.esri.arcgis.carto.
- IMxDocument mxDocument (IMxDocument)app.getD
ocument() - IMap mxDoc mxDocument.getFocusMap()
- FocusMap is the one visible in data view or
selected in layout view.
7Getting all Maps
- You can also get an Object containing all the
Maps. -
- IMaps maps mxDoc.getMaps()
8IMaps
- You can loop through all the IMap Interface
objects in an IMaps Interface object using its
.getCount and .getItem methods. - IMap map null
- for (int i 0 i lt maps.getCount i)
- map maps.getItem(i)
-
- Other IMaps methods include
- add(IMap), create(), remove(IMap),
removeAt(index), Reset Remove all.
9Getting data
- Its rare we want to get data out of a Map. Its
more usual to get data from a Layer (a
Coverage, FeatureDataset, Image etc.).
Map
AttributeTable
FID Data
1 234
2 875
Layer
Feature
234
Values
10Getting Layers I
- If you know what the type of the Layers are, you
can get them thus - // Assuming we've got a IMap object "map".
- ILayer layer null
- for (int i0 i lt map.getLayerCount() i)
- layer map.getLayer(i)
- // Do something
11Enumerations
- Objects containing lists of other objects. Like a
1D array. - Arc uses them to return arrays of data to you.
- Have a next method to get the next object.
- Also a reset method to return to the start.
- ArcObject types have different Enumerations.
- e.g. IEnumLayer is the Interface for a set of
Layers.
12Standard use of Enumerations
- IEnumSomething enumSomething someEnumGett
ingMethod() - enumSomething.reset()
- SomeClass variable enumSomething.next()
- while (variable ! null)
- \\Do stuff with variable
- variable enumSomething.next()
-
- Note we get the first variable first, then do
something with it, before getting the next and
checking whether it is null.
13Getting Layers II
- Get an Enumeration of Layers
- IEnumLayer enumLayer map.getLayers(null,true
) - enumLayer.reset()
- ILayer layer enumLayer.next()
- while (layer ! null)
- \\ Do something with the ILayer
- layer enumLayer.next()
14Types of Layer
- Remember however that we can add many things as
Layers (images, data, etc.). - Main types
- IFeatureLayer
- IGeoFeatureLayer
- IGraphicsLayer
- Others include more specific FeatureLayers,
FDOGraphicsLayers (Annotation), TinLayer,
RasterLayer, and CoverageAnnotationLayer. - If we dont know the layers in the document we
may need to check for a specific type.
15The instanceof keyword
- You can check whether an object implements an
Interface using Javas instanceof keyword. - For example, if the users selected something in
ArcMap's tree of contents, you can test whether
its a GeoFeatureLayer, thus - // Assuming weve got an enumeration of Layers.
- IGeoFeatureLayer featLayer null
- ILayer layer enumLayer.next()
- while (layer ! null)
- if (layer instanceof IGeoFeatureLayer)
- featLayer (IGeoFeatureLayer) layer
- //Do something with featLayer
-
- layer enumLayer.next()
16- Data
- Getting maps and layers
- Getting data points and attributes
- Sorting and searching
17Getting Data/Features from Layers
- Assign your Layer to an appropriate Interface.
- IGeoFeatureLayer Treat as geographical data
- IFeatureLayer Treat as a general Layer
- IAttributeTable Treat as an attribute table
- Get the Attribute Table or search the Layer.
18Getting data
- Once we have our Layer, we want to get data from
it.
Map
AttributeTable
FID Data
1 234
2 875
Layer
Feature
234
Values
19Getting the Attribute Table
- Assuming we have a Layer Enumeration, we set the
Layer to an IAttributeTable. - import com.esri.arcgis.geodatabase.
- IAttributeTable pAttributeTable
-
- (IAttributeTable)enumLayer.next()
-
- ITable table pAttributeTable.getAttributeTable()
-
- IRow row null
-
- for (int i 1 i lt table.rowCount(null) i)
- row table.getRow(i)
- int index table.findField("School")
- Object value row.getValue(index)
20Getting the Attribute Table
IAttributeTable pAttributeTable
(IAttributeTable) enumLayer.next()
ITable table pAttributeTable.getAttributeTable
() IRow row null for (int i
1 i lt table.rowCount(null) i) row
table.getRow(i) int index
table.findField("School") Object value
row.getValue(index)
21Getting data
- Alternative is to get data from a Feature.
Map
AttributeTable
FID Data
1 234
2 875
Layer
Feature
234
Values
First though, we need to get only the features we
are interested in. We can search for these.
22- Data
- Getting maps and layers
- Getting data points and attributes
- Sorting and searching
23Searching
- You need to get a reference to the data and a
search cursor (ICursor / IFeatureCursor). - The search cursor jumps between records in a
dataset that match some search criteria. - The cursor marks the row/feature in the dataset
that youre currently interested in. - They have a nextSomething method which gets a
object appropriate to the dataset.
24Search Methods
- IFeatureLayer / IGeoFeatureLayer
- IFeatureCursor cursor featureLayer.search
- (queryFilter, false)
- ITable from an IAttributeTable
- ICursor cursor table.search
- (queryFilter, false)
- Where queryFilter is an IQueryFilter Object
- True / false determines how the records are
allocated to the Cursor set to False.
25Making a QueryFilter
- You can get everything by setting these to null.
- cursor pFeatureLayer.search(null, false)
- IQueryFilter objects store fields you want
returned and query strings. - You need to (rare this) make a QueryFilter object
from scratch - IQueryFilter queryFilter
- new QueryFilter()
26IQueryFilter Objects
- pQueryFilter.setSubFields("SCHOOL,CITY")
- pQueryFilter.addField ("POSTCODE")
- pQueryFilter.setWhereClause
- "CITY 'Leeds'"
- By default the fields are set to i.e. all
fields, so if you use just addField youll have
to setSubFields to first.
27Sorting data
- You can use searching to also sort data. However,
it is a bit hit-and-miss. - Well look at the more usual TableSort in the
practical.
28Getting Data from a Feature
- Use the cursor to get the next feature
- IFeature feature featureCursor.nextFeature()
- while (feature ! null)
- //Do stuff to feature
- feature featureCursor.nextFeature()
-
- The Feature method getValue(i) takes in an
integer number equalling the position of the
field column. - If you dont know it, there are lookup methods
that return integers - feature.getFields().findField("SCHOOL")
29Setting/Getting Features Selected
- An alternative is to get the selected Features.
- To get the Features you need IMaps
getFeatureSelection method, or an ISelectionSet
Object. - IMaps selectFeature method takes in an ILayer
and IFeature. - Refresh the display using the MxDocuments
refresh. - mxDoc.getActiveView().refresh()
30Getting data
Document (.mxd file)
Map
AttributeTable
FID Data
1 234
2 875
Layer
Feature
234
Values
31Summary
- Get the Applications Document.
- Get the Maps from it.
- Pick the one you want or loop through them.
- Get a Layer from the Map, or Loop through all of
them. - Generate an Attribute table and use Rows / Fields
to get data. - Or use the Layers search routine to search for
Features.
32Next Lecture
- Editing data.
- External applications.
- Practical
- Building a Toolbar.
- Getting and sorting data.