The ArcGIS Runtime sample "Datasources > Add Shapefile" provide source code to select a shapefile and add it to the map based on a blank MPK (Map Package) and a map service (on the LocalServer).My question is how can I get the shapefile Geometry Type before adding it as ArcGISDynamicMapServiceLayer, in order to define the correct Symbol type to pass on DrawingInfo ?source code from ArcGIS sample:/**
* Set up shapefile workspace
*/
private void addShapefile(final String fileName, final String fileDir) {
final String workspaceId = ""+count++; // an arbitrary unique string
// create a local map service and enable dynamic layers
LocalMapService localMapService = new LocalMapService(URL_BLANK_MPK);
localMapService.setEnableDynamicLayers(true);
// get dynamic workspaces from service
WorkspaceInfoSet workspaceInfoSet = localMapService.getDynamicWorkspaces();
// create a workspace info via the static method according to data type
// e.g. shapefile folder connection
WorkspaceInfo workspaceInfo = WorkspaceInfo.CreateShapefileFolderConnection(workspaceId, fileDir);
// set dynamic workspaces for our local map service
workspaceInfoSet.add(workspaceInfo);
localMapService.setDynamicWorkspaces(workspaceInfoSet);
// now start service...
localMapService.start();
// set up a local dynamic layer
final ArcGISDynamicMapServiceLayer localDynamicLayer =
new ArcGISDynamicMapServiceLayer(localMapService.getUrlMapService());
// add the layer to the map
map.getLayers().add(localDynamicLayer);
localDynamicLayer.addLayerInitializeCompleteListener(new LayerInitializeCompleteListener()
{
@Override
public void layerInitializeComplete(LayerInitializeCompleteEvent arg0)
{
DynamicLayerInfoCollection layerInfos = localDynamicLayer.getDynamicLayerInfos();
DynamicLayerInfo layerInfo = layerInfos.get(0);
// Apply a renderer for vector layers.
// QUESTION : HOW CAN WE DETERMINE THE GEOMETRY TYPE BEFORE,
// IN ORDER TO DEFINE THE RIGHT SYMBOL HERE ??
DrawingInfo drawingInfo = new DrawingInfo(simpleRenderer, TRANSPARENCY);
layerInfo.setDrawingInfo(drawingInfo);
// Create the data source
TableDataSource dataSource = new TableDataSource();
dataSource.setWorkspaceId(workspaceId);
dataSource.setDataSourceName(fileName);
// Set the data source
LayerDataSource layerDataSource = new LayerDataSource();
layerDataSource.setDataSource(dataSource);
layerInfo.setLayerSource(layerDataSource);
localDynamicLayer.refresh();
}
});
}even after adding it, I don't know how to do it as GeometryType seems to be available only on GraphicsLayer/ArcGISFeatureLayer.It would be great to be able to do something like this with DynamicLayer/ArcGISDynamicMapServiceLayer :private Symbol getSymbolForGeometryType(GraphicsLayer layer) {
// Here: If I replace parameter by "DynamicLayer layer", then getNumberOfGraphics() is not available !
as dynamic layers doesn't manage Graphics...
Symbol symbol = new SimpleMarkerSymbol(Color.BLACK, 10, Style.SQUARE);
Geometry geometry = null;
if(layer.getNumberOfGraphics() > 0) {
int id = layer.getGraphicIDs()[0];
geometry = layer.getGraphic(id).getGeometry();
}
if(geometry != null){
switch(geometry.getType()){
case POINT:
case MULTIPOINT:
symbol = new SimpleMarkerSymbol(Color.ORANGE, 10, Style.CIRCLE);
break;
case LINE:
case POLYLINE:
symbol = new SimpleLineSymbol(Color.RED, 2.0f);
break;
case POLYGON:
Color polyFillColor = new Color(0, 255, 255, 125);
symbol = new SimpleFillSymbol(polyFillColor, new SimpleLineSymbol(Color.ORANGE, 2.0f));
break;
case ENVELOPE:
break;
case UNKNOWN:
break;
default:
break;
}
}
return symbol;
}