GEOG5990M Programming for Geographical Analysis: Core Skills Dr Andy Evans
Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr...
-
Upload
sarah-patrick -
Category
Documents
-
view
221 -
download
0
description
Transcript of Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr...
![Page 1: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/1.jpg)
Programming for Geographical Information Analysis:
Advanced Skills
Lecture 3: Arc Data FrameworkDr Andy Evans
![Page 2: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/2.jpg)
DataGetting maps and layersGetting data points and attributesSorting and searching
![Page 3: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/3.jpg)
ArcMap 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.
![Page 4: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/4.jpg)
Data
Getting maps and layersGetting data points and attributesSorting and searching
![Page 5: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/5.jpg)
Getting data
Map
Feature
LayerFID Data
1 234
2 875
AttributeTable
234 Values
Document (.mxd file)
![Page 6: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/6.jpg)
Getting 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.getDocument();
IMap mxDoc = mxDocument.getFocusMap();
FocusMap is the one visible in data view or selected in layout view.
![Page 7: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/7.jpg)
Getting all Maps
You can also get an Object containing all the Maps.
IMaps maps = mxDoc.getMaps();
![Page 8: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/8.jpg)
IMaps
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 < maps.getCount; i++) { map = maps.getItem(i)}
Other IMaps methods include…add(IMap), create(), remove(IMap), removeAt(index), Reset [Remove all].
![Page 9: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/9.jpg)
Getting dataIt’s rare we want to get data out of a Map. It’s more usual to get data from a Layer ~ (a Coverage, FeatureDataset, Image etc.).
Map
Feature
LayerFID Data
1 234
2 875
AttributeTable
234 Values
![Page 10: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/10.jpg)
Getting Layers IIf 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 i=0; i < map.getLayerCount(); i++) {layer = map.getLayer(i); // Do something
}
![Page 11: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/11.jpg)
Enumerations
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.
![Page 12: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/12.jpg)
Standard use of EnumerationsIEnumSomething enumSomething =
someEnumGettingMethod();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.
![Page 13: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/13.jpg)
Getting Layers IIGet an Enumeration of Layers
IEnumLayer enumLayer = map.getLayers(null,true);
enumLayer.reset();
ILayer layer = enumLayer.next();
while (layer != null) {\\ Do something with the ILayerlayer = enumLayer.next();
}
![Page 14: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/14.jpg)
Types of LayerRemember however that we can add many things as Layers (images, data, etc.). Main types:
IFeatureLayer
IGeoFeatureLayer
IGraphicsLayerOthers include more specific FeatureLayers, FDOGraphicsLayers (Annotation), TinLayer, RasterLayer, and CoverageAnnotationLayer.If we don’t know the layers in the document we may need to check for a specific type.
![Page 15: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/15.jpg)
The instanceof keywordYou can check whether an object implements an Interface using Java’s instanceof keyword. For example, if the user’s selected something in ArcMap's tree of contents, you can test whether it’s a GeoFeatureLayer, thus…
// Assuming we’ve 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();
}
![Page 16: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/16.jpg)
Data
Getting maps and layers
Getting data points and attributesSorting and searching
![Page 17: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/17.jpg)
Getting Data/Features from Layers
Assign your Layer to an appropriate Interface.IGeoFeatureLayer : Treat as geographical dataIFeatureLayer : Treat as a general LayerIAttributeTable : Treat as an attribute table
Get the Attribute Table or search the Layer.
![Page 18: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/18.jpg)
Getting dataOnce we have our Layer, we want to get data from it.
Map
Feature
LayerFID Data
1 234
2 875
AttributeTable
234 Values
![Page 19: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/19.jpg)
Getting the Attribute TableAssuming 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 <= table.rowCount(null); i++) {
row = table.getRow(i);
int index = table.findField("School");Object value = row.getValue(index);
}
![Page 20: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/20.jpg)
Getting the Attribute TableGet Layer as AttributeTable
Get actual Table
Get each row
Get a particular Field
IAttributeTable pAttributeTable = (IAttributeTable) enumLayer.next();
ITable table = pAttributeTable.getAttributeTable(); IRow row = null; for (int i = 1; i <= table.rowCount(null) ; i++) {
row = table.getRow(i);
int index = table.findField("School");Object value = row.getValue(index);
}
![Page 21: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/21.jpg)
Getting dataAlternative is to get data from a Feature.
Map
Feature
LayerFID Data
1 234
2 875
AttributeTable
234 Values
First though, we need to get only the features we are interested in. We can search for these.
![Page 22: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/22.jpg)
DataGetting maps and layers
Getting data points and attributes
Sorting and searching
![Page 23: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/23.jpg)
Searching
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 you’re currently interested in.
They have a nextSomething method which gets a object appropriate to the dataset.
![Page 24: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/24.jpg)
Search Methods
IFeatureLayer / IGeoFeatureLayer
IFeatureCursor cursor = featureLayer.search(queryFilter, false);
ITable from an IAttributeTable
ICursor cursor = table.search (queryFilter, false);
Where queryFilter is an IQueryFilter ObjectTrue / false determines how the records are allocated to the Cursor – set to False.
![Page 25: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/25.jpg)
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();
Making a QueryFilter
![Page 26: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/26.jpg)
IQueryFilter 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 you’ll have to setSubFields to “” first.
![Page 27: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/27.jpg)
Sorting data
You can use searching to also sort data. However, it is a bit hit-and-miss.
We’ll look at the more usual TableSort in the practical.
![Page 28: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/28.jpg)
Getting 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 don’t know it, there are lookup methods that return integers…feature.getFields().findField("SCHOOL");
![Page 29: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/29.jpg)
Setting/Getting Features Selected
An alternative is to get the selected Features.
To get the Features you need IMap’s getFeatureSelection method, or an ISelectionSet Object.
IMap’s selectFeature method takes in an ILayer and IFeature.Refresh the display using the MxDocument’s refresh.
mxDoc.getActiveView().refresh();
![Page 30: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/30.jpg)
Getting data
Map
Feature
LayerFID Data
1 234
2 875
AttributeTable
234 Values
Document (.mxd file)
![Page 31: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/31.jpg)
Summary
Get the Application’s 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 Layer’s search routine to search for Features.
![Page 32: Programming for Geographical Information Analysis: Advanced Skills Lecture 3: Arc Data Framework Dr Andy Evans.](https://reader036.fdocuments.us/reader036/viewer/2022062306/5a4d1b6c7f8b9ab0599b3852/html5/thumbnails/32.jpg)
Next Lecture
Editing data.External applications.
PracticalBuilding a Toolbar.Getting and sorting data.