arcgis for server: publishing and using map services
TRANSCRIPT
ArcGIS for Server: Publishing and Using Map Services
Craig Williams & Tanu Hoque
Link to this presentation: http://bit.ly/1EA5dEI
Agenda
• Platform overview• Publishing services
- Demo: Publishing hosted feature service
• Map services - Demo: layer IDs, dynamic layers, query statistics,
query layers
• Standardized queries with services• Questions
The ArcGIS Platform
• Online / Portal• Desktop• Server• Apps• Developer• Solutions
Desktop Web Device
Server Online Content and Services
Online / Portal
Publishing services
Information Sharing is Critical
Transparency and easy information access are now expected…
Users
Search & Use
. . . Sharing With a Group,Organization, or the Open Web
Sharing as Services
• Our goal: make it easier to share GIS resources- Unified sharing experience- Comprehensive analysis- Sharing to servers in the enterprise and to ArcGIS Online / Portal
Professional to Everyone
ArcGIS
Sharing as Services
ArcGISOnline / Portal
ArcGIS Server On The Cloud
ArcGIS Server On-premises
Desktop
Hosted feature services
Sharing Layers Online
Hosted Mapping on ArcGIS Online
• Sharing the easy way- No Server to buy, install, or maintain- Scales automatically- No Firewall or IT issues
• Limitations- Only Tiled Map and Feature Services supported- Data is private to each service
ArcGIS
ArcGIS Server in the Enterprise
• Recent improvements- Successful publishing of shared data- Comprehensive analysis- Simple publishing with copying of data
• When to use?- Need the full functionality of ArcGIS Server- Want full control over all hard and software- Want to publish services on live, shared data
ArcGIS Server Data Stores
• Server has a list of registered Data Stores• Data Store is of type
- Enterprise Geodatabase- Folder
- Tip: register top-most folder level possible for maximal benefit
• Access to the Data Store is validated during registration - On all machines in the site
• Replicated data stores for separate data instances- Tip: Read Help Topic About registering your data with the server
Data Stores are a key concept for publishing to ArcGIS Server
Service Definition (.sd)
• File format for publishing all services- For all services (Map, Geoprocessing, etc.)
• Contains everything required to create a service:- GIS resources (Map, Globe, etc.)
- embeddable fonts (if needed)- Service Configuration- Data (if it needs to be copied to the server)
• Uploaded to the server when publishing• Can be saved and published later
- Using Catalog or Server Manager
Map Services
Review of Map Services Since ArcGIS 10.1
• One unified map service- An updated optimized map service- Supports additional capabilities, data types, layers, renderers
• New extension capabilities: - Network Analysis
• Can be used to display Geoprocessing results
Application
ArcGIS Server
Map Server
http
Preserve Layer/Table IDsQuery By DistanceQuery ReturnExtentPaginationDynamicLayersQuery to return statisticsQueryLayer
MapService Demos
Map Services: New at 10.3x
Preserving Layer/Table IDsLayer/Table IDs do not change when map service is republished
Service directory
3
5
With immutable layers
Without immutable layers
Re-publish
• Introduced at 10.3• This ensures that Layer IDs are unique (as usual)• and preserves the IDs originally assigned
Preserving Layer/Table IDsHow to enable?
In ArcMap, set Data Frame Properties …
In the Layer Properties you can assign your own ID if you like. ArcGIS will ensure it is unique.By default the option is unchecked
Preserving Layer/Table IDsAnalyzer
• In the case of duplicate layer IDs, the analyzer will detect
Preserving Layer/Table IDsThings to remember
• You can now add, remove, shuffle layers• Your layer IDs will remain and your apps won’t break
• You need to republish …
Pagination (ver 10.3)
• Check the layer/table resources to make sure it support pagination
• Two properties are added to the Query operation
Pagination (JavaScript API for ArcGIS)• Two properties are added to the Query class
• Supported data sources- Most enterprise databases e.g. SQL Server (ver 2012+), Oracle, PostgreSQL- QueryLayer
• FileGDBs support at 10.3.1• File based datasource e.g. Shape files do not support pagination
Pagination (ver 10.3)
Query by Distance and ReturnExtents (ver 10.3.1)
• Check the layer/table resources to make sure it support pagination
• 3 properties are added to the Query operation
Query by Distance (JavaScript API for ArcGIS)• Two properties are added to the Query class
Query to ReturnExtents (JavaScript API for ArcGIS)
• New method and event in the QueryTask class
How to enable dynamicLayer?Change layer’s rendererAdd new layerUse client side data with map serviceQuery layer
MapService: DynamicLayers
Dynamic Layers: The Concept
• Capability with the map service that allows for per-request changes to the map- Optional capability of map services
• Allows for:- Updating renderers and symbols- Removing and reordering layers- Changing layer data sources- Adding new layers from registered data sources
Dynamic Layers: Use Cases
• Simple updates to the map service- Remove layers or reorder layers
• Thematic mapping- Updates to renderers
• Adding content to the map service- Add data from registered workspaces
- Including query layers
• Add to the map on a per-request basis- ArcGIS APIs handle this for you
Application
Map Service
REST
Workspaces
http json
Thematic Mapping
• Special case of dynamic layers supported via- Ability to change renderer- Ability to change data sources – including joins- Map service API for constructing renderer classes
• Generate renderer operation- Supports class breaks and unique value class generation- Popular classification types from ArcGIS for Desktop
Thematic Mapping
• When do I use dynamic layers instead of feature layers on the client for thematic mapping?
- large number of features- complex geometries that cannot be generalized- when it provides a performance advantage
• Each approach has tradeoffs- e.g. Client side features scale better and provide more interactive behavior- Generate renderer can be used with both approaches
When to use?
Enabling Dynamic Layers
Dynamic Layers
• See the topic About dynamic layers in the ArcGIS Server help• REST API – See the Dynamic Layer / Table resource help
More Information
OutStatisticsStandardizedQueries
MapService: Queries
Getting aggregated values in a Query result in Map Services
• Support for order by, output statistics, and group by statistics was added for both layers / tables
- count | sum | min | max | avg | std dev | var
• Additional query capabilities- Optional ability to return M and Z values for features- Can query a specific geodatabase version- Query response contains a flag when maxRecordCount was reached by the query
Database Agnostic Way to Query
• One SQL syntax runs against all databases!- e.g. one date query syntax --- YEAH!
- incident_time = date '3/16/2000 3:45:47 PM‘- upper(name) = ‘JOHN EDWARD’
• Based on SQL92 query syntax and functions- Does not accept any DB vendor specific queries- http://resources.arcgis.com/en/help/main/10.2/index.html#/Supported_SQL_functions_
in_ArcGIS_Server/015400000686000000/
• StandardizedQuery is turned on by default
Standardized Queries - Introduced at ArcGIS 10.2
Database Agnostic Way to Query
• Limitations- Only a subset of functions available- Not supported for
- Joined table/layer from multiple workspaces or OLE DB tables
• Server level property- To switch back:- http://<server>/arcgis/admin/system/properties/update- {"standardizedQueries":"false"}
Standardized Queries - Introduced at ArcGIS 10.2
Rate This Sessionwww.esri.com/RateMyDevSummitSession
Questions?Link to this presentation: http://bit.ly/1EA5dEI
Modify drawingInfo:Change layer’s rendererDefine layer’s labels
Add new layerUse client side data with map serviceQuery layer
Sample Code Appendix
Sample code to Modify Drawing Info (Renderer and Labels)
Dynamic Layers: Generate RendererREST request http://esriurl.com/5978
http://.../MapServer/2/generateRenderer?classificationDef = {
"type": "classBreaksDef","classificationField": "POP2007","classificationMethod": "esriClassifyQuantile","breakCount": 5,"colorRamp": {
"type": "algorithmic","fromColor": [255, 255, 255, 255],"toColor": [0, 0, 255, 255 ],"algorithm": "esriCIELabAlgorithm"
}}
Dynamic Layers: Update RendererREST request http://esriurl.com/5979
http://.../Census/MapServer/export?....&dynamicLayers = [ {
"source": {"type": "mapLayer","mapLayerId": 0
},"drawingInfo": {
"renderer": {"type": "classBreaks","field": "POP2007","classBreakInfos": [ … ]
} } ]
Dynamic Layers: Dynamic LabelingREST request http://esriurl.com/8900
http://.../Census/MapServer/export?....&dynamicLayers = [ {
"source": {"type": "mapLayer","mapLayerId": 2
},"drawingInfo": { ... },"showLabels": true,"labelingInfo": [ {
"labelExpression": "[POP2000]","labelPlacement": "esriServerPolygonPlacementAlwaysHorizontal","symbol": { ... } } ]
} ] Help on LabelExpression: htttp://esriurl.com/8903
Dynamic Layers: Generate RendererJavaScript API code http://esriurl.com/5968
var generateRenderer = new esri.tasks.GenerateRendererTask("http://serv../cens/MapServer/2");
var params = new esri.tasks.GenerateRendererParameters();params.classificationDefinition = classDef;
generateRenderer.execute(params, applyRenderer, errorHandler)
1
2
3
Dynamic Layers: Update RendererJavaScript API code http://esriurl.com/8901
generateRenderer.execute(params, applyRenderer, errorHandler);
function applyRenderer(renderer) {var drawingOptions = new esri.layers.LayerDrawingOptions();drawingOptions.renderer = renderer; optionsArray[2] = drawingOptions;usaLayer.setLayerDrawingOptions(optionsArray);usaLayer.show();
}
1
2
Dynamic Layers: Dynamic LabelingJavaScript API code http://esriurl.com/8902
var drawingOptions = new LayerDrawingOptions();var labelClass = new LabelClass( {
labelExpression: ' "Name: " CONCAT [CNTY_FIPS] CONCAT NEWLINE CONCAT "Count: " CONCAT [POP2000] '});
labelClass.labelPlacement = "always-horizontal";labelClass.symbol = new TextSymbol( {font: new Font("12",
Font.STYLE_NORMAL,Font.VARIANT_NORMAL,Font.WEIGHT_BOLD,"Arial"),
color: new Color("#666633"),horizontalAlignment: "left" });
drawingOptions.labelingInfo = [labelClass];drawingOptions.showLabels = true;
Sample code to Add New Layer
Dynamic Layers: Add Layer from Registered WorkspaceREST request http://esriurl.com/5980
http://.../USA/MapServer/export?....&dynamicLayers = [ {
"id": 104,"source": {
"type": "dataLayer","dataSource": {
"type": "table","workspaceId": "MyDatabaseWorkspaceIDSSR2","dataSourceName": "ss6.gdb.Lakes"
}},"drawingInfo": {…}
} ]
Dynamic Layers: Add Layer from Registered WorkspaceJavaScript API code http://esriurl.com/5974
var dynamicLayerInfos = usaLayer.createDynamicLayerInfosFromLayerInfos();
var dataSource = new esri.layers.TableDataSource();dataSource.workspaceId = "MyDatabaseWorkspaceIDSSR2";dataSource.dataSourceName = "egdb.DBADMIN.USLakes";var layerSource = new esri.layers.LayerDataSource();layerSource.dataSource = dataSource;
var dynamicLayerInfo = new esri.layers.DynamicLayerInfo();dynamicLayerInfo.source = layerSource;
dynamicLayerInfos.splice(0, 0, dynamicLayerInfo);usaLayer.setDynamicLayerInfos(dynamicLayerInfos);
1
2
3
4
Sample code to Use Client Side DataBlog: http://esriurl.com/5993
Dynamic Layers: Add Query LayerREST request http://esriurl.com/5982
http://.../USA/MapServer/export?....&dynamicLayers = [ {
"source": {"type": "dataLayer","dataSource": {
"type": "queryTable","workspaceId": "MyDatabaseWorkspaceIDSSR2","query": "SELECT * FROM ss6.gdb.Lakes","oidFields": "objectid","geometryType": "esriGeometryPolygon","spatialReference": { "wkid": 4326 }
} },"drawingInfo": {…} } ]
Dynamic Layers: Add Query LayerJavaScript API code http://esriurl.com/5977
var dynamicLayerInfos = usaLayer.createDynamicLayerInfosFromLayerInfos();
var queryDataSource = new esri.layers.QueryDataSource();queryDataSource.workspaceId = "MyDatabaseWorkspaceIDSSR2";queryDataSource.query = "SELECT * FROM ss6.gdb.Lakes";queryDataSource.oidFields = ["objectid"] ;queryDataSource.geometryType = "polygon";queryDataSource.spatialReference = new esri.SpatialReference({wkid:4326});
layerSource.dataSource = queryDataSource;var dynamicLayerInfo = new esri.layers.DynamicLayerInfo();dynamicLayerInfo.source = layerSource;
dynamicLayerInfos.splice(0, 0, dynamicLayerInfo);usaLayer.setDynamicLayerInfos(dynamicLayerInfos);
1
2
3
4
SQL Query to Compute Population Mean Center
select 1 as oid,geometry::Point(
sum(a.shape.STCentroid().STX * b.Yr_1930) / sum(b.Yr_1930), sum(a.shape.STCentroid().STY * b.Yr_1930) / sum(b.Yr_1930),
'102008') as shapefrom STATES as a
inner join USPOP1900TO2013 as b
on a.STATE_ABBR = b.STATE_ABBR
select 1 as oid,geometry::Point(
sum(a.shape.STCentroid().STX * b.Yr_1930) / sum(b.Yr_1930), sum(a.shape.STCentroid().STY * b.Yr_1930) / sum(b.Yr_1930),
'102008') as shapefrom STATES as a
inner join USPOP1900TO2013 as b
on a.STATE_ABBR = b.STATE_ABBR