//Get all styles in the projectvarProjectStyles= Project.Current.GetItems<StyleProjectItem>();//Get a specific style in the project by nameStyleProjectItemstyle= ProjectStyles.First(x => x.Name =="NameOfTheStyle");
How to create a new style
//Full path for the new style file (.stylx) to be createdstringstyleToCreate=@"C:\Temp\NewStyle.stylx";await QueuedTask.Run(()=> StyleHelper.CreateStyle(Project.Current, styleToCreate));
How to add a style to project
//For ArcGIS Pro system styles, just pass in the name of the style to add to the projectawait QueuedTask.Run(()=> StyleHelper.AddStyle(Project.Current,"3D Vehicles"));//For custom styles, pass in the full path to the style file on diskstringcustomStyleToAdd=@"C:\Temp\CustomStyle.stylx";await QueuedTask.Run(()=> StyleHelper.AddStyle(Project.Current, customStyleToAdd));
How to remove a style from project
//For ArcGIS Pro system styles, just pass in the name of the style to remove from the projectawait QueuedTask.Run(()=> StyleHelper.RemoveStyle(Project.Current,"3D Vehicles"));//For custom styles, pass in the full path to the style file on diskstringcustomStyleToAdd=@"C:\Temp\CustomStyle.stylx";await QueuedTask.Run(()=> StyleHelper.RemoveStyle(Project.Current, customStyleToAdd));
How to add a style item to a style
public Task AddStyleItemAsync(StyleProjectItemstyle,StyleItemitemToAdd){return QueuedTask.Run(()=>{if(style==null||itemToAdd==null)thrownew System.ArgumentNullException();//Add the item to style style.AddItem(itemToAdd);});}
How to remove a style item from a style
public Task RemoveStyleItemAsync(StyleProjectItemstyle,StyleItemitemToRemove){return QueuedTask.Run(()=>{if(style==null||itemToRemove==null)thrownew System.ArgumentNullException();//Remove the item from style style.RemoveItem(itemToRemove);});}
How to determine if a style can be upgraded
//Pass in the full path to the style file on diskpublicasyncTask<bool>CanUpgradeStyleAsync(stringstylePath){//Add the style to the current projectawait QueuedTask.Run(()=> StyleHelper.AddStyle(Project.Current, stylePath));StyleProjectItemstyle= Project.Current.GetItems<StyleProjectItem>().First(x => x.Path ==stylePath);//returns true if style can be upgradedreturn style.CanUpgrade;}
How to determine if a style is read-only
//Pass in the full path to the style file on diskpublicasyncTask<bool>IsReadOnly(stringstylePath){//Add the style to the current projectawait QueuedTask.Run(()=> StyleHelper.AddStyle(Project.Current, stylePath));StyleProjectItemstyle= Project.Current.GetItems<StyleProjectItem>().First(x => x.Path ==stylePath);//returns true if style is read-onlyreturn style.IsReadOnly;}
How to determine if a style is current
//Pass in the full path to the style file on diskpublicasyncTask<bool>IsCurrent(stringstylePath){//Add the style to the current projectawait QueuedTask.Run(()=> StyleHelper.AddStyle(Project.Current, stylePath));StyleProjectItemstyle= Project.Current.GetItems<StyleProjectItem>().First(x => x.Path ==stylePath);//returns true if style matches the current Pro versionreturn style.IsCurrent;}
How to upgrade a style
//Pass in the full path to the style file on diskpublicasyncTask<bool>UpgradeStyleAsync(stringstylePath){boolsuccess=false;//Add the style to the current projectawait QueuedTask.Run(()=> StyleHelper.AddStyle(Project.Current, stylePath));StyleProjectItemstyle= Project.Current.GetItems<StyleProjectItem>().First(x => x.Path ==stylePath);//Verify that style can be upgradedif(style.CanUpgrade){success=await QueuedTask.Run(()=> StyleHelper.UpgradeStyle(style));}//return true if style was upgradedreturnsuccess;}
Symbols
How to construct a point symbol of a specific color and size
How to construct a point symbol from a file on disk
//The following file formats can be used to create the marker: DAE, 3DS, FLT, EMF, JPG, PNG, BMP, GIFCIMMarkermarkerFromFile=await QueuedTask.Run(()=> SymbolFactory.Instance.ConstructMarkerFromFile(@"C:\Temp\fileName.dae"));CIMPointSymbolpointSymbolFromFile= SymbolFactory.Instance.ConstructPointSymbol(markerFromFile);
How to construct a point symbol from a in memory graphic
//Create a stream for the image//At 3.0 you need https://www.nuget.org/packages/Microsoft.Windows.Compatibility//System.Drawing
System.Drawing.Image newImage= System.Drawing.Image.FromFile(@"C:\PathToImage\Image.png");varstream=new System.IO.MemoryStream();
newImage.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
stream.Position =0;//Create marker using the streamCIMMarkermarkerFromStream= SymbolFactory.Instance.ConstructMarkerFromStream(stream);//Create the point symbol from the markerCIMPointSymbolpointSymbolFromStream= SymbolFactory.Instance.ConstructPointSymbol(markerFromStream);
How to construct a polygon symbol of specific color and fill style
How to construct a multilayer line symbol with circle markers on the line ends
//These methods must be called within the lambda passed to QueuedTask.RunvarlineStrokeRed= SymbolFactory.Instance.ConstructStroke(ColorFactory.Instance.RedRGB,4.0);varmarkerCircle= SymbolFactory.Instance.ConstructMarker(ColorFactory.Instance.RedRGB,12, SimpleMarkerStyle.Circle);
markerCircle.MarkerPlacement =new CIMMarkerPlacementOnVertices(){AngleToLine=true,PlaceOnEndPoints=true,Offset=0};varlineSymbolWithCircles=new CIMLineSymbol(){SymbolLayers=new CIMSymbolLayer[2]{ markerCircle, lineStrokeRed }};
How to construct a multilayer line symbol with an arrow head on the end
//These methods must be called within the lambda passed to QueuedTask.RunvarmarkerTriangle= SymbolFactory.Instance.ConstructMarker(ColorFactory.Instance.RedRGB,12, SimpleMarkerStyle.Triangle);
markerTriangle.Rotation =-90;// or -90
markerTriangle.MarkerPlacement =new CIMMarkerPlacementOnLine(){AngleToLine=true,RelativeTo= PlacementOnLineRelativeTo.LineEnd };varlineSymbolWithArrow=new CIMLineSymbol(){SymbolLayers=new CIMSymbolLayer[2]{ markerTriangle,
SymbolFactory.Instance.ConstructStroke(ColorFactory.Instance.RedRGB,2)}};
How to get symbol reference from a symbol
CIMPolygonSymbolsymbol= SymbolFactory.Instance.ConstructPolygonSymbol(ColorFactory.Instance.RedRGB);//Get symbol reference from the symbolCIMSymbolReferencesymbolReference= symbol.MakeSymbolReference();
Modify a point symbol created from a character marker
//create marker from the Font, char index,size,colorvarcimMarker= SymbolFactory.Instance.ConstructMarker(125,"Wingdings 3","Regular",6, ColorFactory.Instance.BlueRGB)as CIMCharacterMarker;varpolygonMarker= cimMarker.Symbol;//modifying the polygon's outline and fill//This is the outline
polygonMarker.SymbolLayers[0]= SymbolFactory.Instance.ConstructStroke(ColorFactory.Instance.GreenRGB,2, SimpleLineStyle.Solid);//This is the fill
polygonMarker.SymbolLayers[1]= SymbolFactory.Instance.ConstructSolidFill(ColorFactory.Instance.BlueRGB);//create a symbol from the marker //Note this overload of ConstructPointSymbol does not need to be run within QueuedTask.Run.varpointSymbol= SymbolFactory.Instance.ConstructPointSymbol(cimMarker);
Get a List of Available Fonts
//Must use QueuedTask.Run(...)//returns a tuple per font: (string fontName, List<string> fontStyles)varfonts= SymbolFactory.Instance.GetAvailableFonts();foreach(var font in fonts){varstyles=string.Join(",", font.fontStyles);
System.Diagnostics.Debug.WriteLine($"{font.fontName}, styles: {styles}");}
Get/Set Default Font
//Must use QueuedTask.Run(...)vardef_font= SymbolFactory.Instance.DefaultFont;
System.Diagnostics.Debug.WriteLine($"{def_font.fontName}, styles: {def_font.styleName}");//set default font - set through application options//Must use QueuedTask
ApplicationOptions.TextAndGraphicsElementsOptions.SetDefaultFont("tahoma");
ApplicationOptions.TextAndGraphicsElementsOptions.SetDefaultFont("tahoma","bold");
Construct a Text Symbol With Options
QueuedTask.Run(()=>{//using the default fontvartextSym1= SymbolFactory.Instance.ConstructTextSymbol();vartextSym2= SymbolFactory.Instance.ConstructTextSymbol( ColorFactory.Instance.BlueRGB,14);//using a specific fontvartextSym3= SymbolFactory.Instance.ConstructTextSymbol("Arial");vartextSym4= SymbolFactory.Instance.ConstructTextSymbol("Arial","Narrow Bold");//or query available fonts to ensure the font is therevarall_fonts= SymbolFactory.Instance.GetAvailableFonts();varfont= all_fonts.FirstOrDefault(f => f.fontName =="Arial");if(!string.IsNullOrEmpty(font.fontName)){vartextSym5= SymbolFactory.Instance.ConstructTextSymbol(font.fontName);//or with a font+stylevartextSym6= SymbolFactory.Instance.ConstructTextSymbol( font.fontName, font.fontStyles.First());}//overloads - font + color and size, etcvartextSym7= SymbolFactory.Instance.ConstructTextSymbol( ColorFactory.Instance.BlueRGB,14,"Times New Roman","Italic");//custom symbol - black stroke, red fillvarpoly_symbol= SymbolFactory.Instance.ConstructPolygonSymbol( SymbolFactory.Instance.ConstructSolidFill(ColorFactory.Instance.RedRGB), SymbolFactory.Instance.ConstructStroke(ColorFactory.Instance.BlackRGB,1));vartextSym8= SymbolFactory.Instance.ConstructTextSymbol( poly_symbol,14,"Georgia","Bold");});
Create a Swatch for a given symbol
//Note: call within QueuedTask.Run()CIMSymbolsymbol= SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.GreenRGB,1.0, SimpleMarkerStyle.Circle);//You can generate a swatch for a text symbols also.varsi=new SymbolStyleItem(){Symbol=symbol,PatchHeight=64,PatchWidth=64};return si.PreviewImage;
Convert Point Symbol to SVG
//Note: Run within QueuedTask.Run//Create a point symbolvarpointSymbol= SymbolFactory.Instance.ConstructPointSymbol(
ColorFactory.Instance.RedRGB,24, SimpleMarkerStyle.RoundedSquare);//Generate image returns a stream//OutputImageFormat specified the format for the image - in this case//we want SVG (an xml-based format)////output fmt: SVG, scale factor x2, centerAnchorPoint = true//dpi = 300, wd x ht: 100x100px, background: whitevarmem_strm= SymbolFactory.Instance.GenerateImage(
pointSymbol, OutputImageFormat.SVG,2.0,true,300,100,100,
ColorFactory.Instance.WhiteRGB);//Set the memory stream position to the beginning
mem_strm.Seek(0, SeekOrigin.Begin);//File path and name for saving the SVG filevarfileName="RoundedSquareSymbol.svg";stringpath_svg= Path.Combine(Path.GetTempPath()+fileName);//Write the memory stream to the file
System.IO.File.WriteAllBytes(path_svg, mem_strm.ToArray());////////////////////////////////////////////////Note: to convert SVG to image format, use a 3rd party//e.g. Aspose.SVG for .NET, for example convert SVG to PNG//using (var svg_doc = new Aspose.Svg.SVGDocument(path_svg))//{// string path_png = Path.Combine(Path.GetTempPath() + "RoundedSquareSymbol.png");// using (var img_png = new Aspose.Svg.Rendering.Image.ImageDevice(// new ImageRenderingOptions(ImageFormat.Png), path_png))// {// svg_doc.RenderTo(img_png);// }// //also: https://docs.aspose.com/imaging/net/convert-svg-to-png///}
Convert Point Symbol to PNG
//Note: Run within QueuedTask.Run//Create a point symbolvarpointSymbol= SymbolFactory.Instance.ConstructPointSymbol(
ColorFactory.Instance.RedRGB,24, SimpleMarkerStyle.RoundedSquare);//Generate image returns a stream//OutputImageFormat specified the format for the image - in this case//we want PNG////output fmt: PNG, scale factor x2, centerAnchorPoint = true//dpi = 300, wd x ht: 100x100px, background: whitevarmem_strm= SymbolFactory.Instance.GenerateImage(
pointSymbol, OutputImageFormat.PNG,2.0,true,300,100,100,
ColorFactory.Instance.WhiteRGB);//Set the memory stream position to the beginning
mem_strm.Seek(0, SeekOrigin.Begin);//Write the stream to a bit mapvarbitmapImage=new System.Windows.Media.Imaging.BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource =mem_strm;
bitmapImage.CacheOption = System.Windows.Media.Imaging.BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
bitmapImage.Freeze();//Write the bit map out to a file//File path and name for saving the PNG filevarfileName="RoundedSquareSymbol.png";stringpath_png= Path.Combine(Path.GetTempPath()+fileName);BitmapEncoderencoder=new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapImage));using(varfileStream=new System.IO.FileStream(
path_png, System.IO.FileMode.Create)){
encoder.Save(fileStream);}
Lookup Symbol
//Note: Run within QueuedTask.Run//Get the selectionvarselection= featureLayer.GetSelection();//Get the first Object IDvarfirstOID= selection.GetObjectIDs().FirstOrDefault();//Determine whether the layer's renderer type supports symbol lookup.if(featureLayer.CanLookupSymbol()){//Looks up the symbol for the corresponding feature identified by the object id.varsymbol= featureLayer.LookupSymbol(firstOID, MapView.Active);varjSon= symbol.ToJson();//Create a JSON encoding of the symbol//Do something with symbol}
Symbol Search
How to search for a specific item in a style
publicTask<SymbolStyleItem>GetSymbolFromStyleAsync(StyleProjectItemstyle,stringkey){return QueuedTask.Run(()=>{if(style==null)thrownew System.ArgumentNullException();//Search for a specific point symbol in styleSymbolStyleItemitem=(SymbolStyleItem)style.LookupItem(StyleItemType.PointSymbol, key);returnitem;});}
How to search for point symbols in a style
publicTask<IList<SymbolStyleItem>>GetPointSymbolsFromStyleAsync(StyleProjectItemstyle,stringsearchString){if(style==null)thrownew System.ArgumentNullException();//Search for point symbolsreturn QueuedTask.Run(()=> style.SearchSymbols(StyleItemType.PointSymbol, searchString));}
How to search for line symbols in a style
publicTask<IList<SymbolStyleItem>>GetLineSymbolsFromStyleAsync(StyleProjectItemstyle,stringsearchString){if(style==null)thrownew System.ArgumentNullException();//Search for line symbolsreturn QueuedTask.Run(()=> style.SearchSymbols(StyleItemType.LineSymbol, searchString));}
How to search for polygon symbols in a style
publicasyncTask<IList<SymbolStyleItem>>GetPolygonSymbolsFromStyleAsync(StyleProjectItemstyle,stringsearchString){if(style==null)thrownew System.ArgumentNullException();//Search for polygon symbolsreturnawait QueuedTask.Run(()=> style.SearchSymbols(StyleItemType.PolygonSymbol, searchString));}
How to search for colors in a style
publicasyncTask<IList<ColorStyleItem>>GetColorsFromStyleAsync(StyleProjectItemstyle,stringsearchString){if(style==null)thrownew System.ArgumentNullException();//Search for colorsreturnawait QueuedTask.Run(()=> style.SearchColors(searchString));}
How to search for color ramps in a style
publicasyncTask<IList<ColorRampStyleItem>>GetColorRampsFromStyleAsync(StyleProjectItemstyle,stringsearchString){//StyleProjectItem can be "ColorBrewer Schemes (RGB)", "ArcGIS 2D"...if(style==null)thrownew System.ArgumentNullException();//Search for color ramps//Color Ramp searchString can be "Spectral (7 Classes)", "Pastel 1 (3 Classes)", "Red-Gray (10 Classes)"..returnawait QueuedTask.Run(()=> style.SearchColorRamps(searchString));}
How to search for north arrows in a style
publicTask<IList<NorthArrowStyleItem>>GetNorthArrowsFromStyleAsync(StyleProjectItemstyle,stringsearchString){if(style==null)thrownew System.ArgumentNullException();//Search for north arrowsreturn QueuedTask.Run(()=> style.SearchNorthArrows(searchString));}
How to search for scale bars in a style
publicTask<IList<ScaleBarStyleItem>>GetScaleBarsFromStyleAsync(StyleProjectItemstyle,stringsearchString){if(style==null)thrownew System.ArgumentNullException();//Search for scale barsreturn QueuedTask.Run(()=> style.SearchScaleBars(searchString));}
How to search for label placements in a style
publicTask<IList<LabelPlacementStyleItem>>GetLabelPlacementsFromStyleAsync(StyleProjectItemstyle,stringsearchString){if(style==null)thrownew System.ArgumentNullException();//Search for standard label placementreturn QueuedTask.Run(()=> style.SearchLabelPlacements(StyleItemType.StandardLabelPlacement, searchString));}
How to set symbol for a feature layer symbolized with simple renderer
public Task SetFeatureLayerSymbolAsync(FeatureLayerftrLayer,CIMSymbolsymbolToApply){if(ftrLayer==null||symbolToApply==null)thrownew System.ArgumentNullException();return QueuedTask.Run(()=>{//Get simple renderer from the feature layerCIMSimpleRenderercurrentRenderer= ftrLayer.GetRenderer()as CIMSimpleRenderer;if(currentRenderer==null)return;//Set symbol's real world setting to be the same as that of the feature layer symbolToApply.SetRealWorldUnits(ftrLayer.UsesRealWorldSymbolSizes);//Update the symbol of the current simple renderer currentRenderer.Symbol = symbolToApply.MakeSymbolReference();//Update the feature layer renderer ftrLayer.SetRenderer(currentRenderer);});}
How to apply a symbol from style to a feature layer
public Task SetFeatureLayerSymbolFromStyleItemAsync(FeatureLayerftrLayer,SymbolStyleItemsymbolItem){if(ftrLayer==null||symbolItem==null)thrownew System.ArgumentNullException();return QueuedTask.Run(()=>{//Get simple renderer from the feature layerCIMSimpleRenderercurrentRenderer= ftrLayer.GetRenderer()as CIMSimpleRenderer;if(currentRenderer==null)return;//Get symbol from the SymbolStyleItemCIMSymbolsymbol= symbolItem.Symbol;//Set symbol's real world setting to be the same as that of the feature layer symbol.SetRealWorldUnits(ftrLayer.UsesRealWorldSymbolSizes);//Update the symbol of the current simple renderer currentRenderer.Symbol = symbol.MakeSymbolReference();//Update the feature layer renderer ftrLayer.SetRenderer(currentRenderer);});}
How to apply a point symbol from a style to a feature layer
// var map = MapView.Active.Map;// if (map == null)// return;// var pointFeatureLayer =// map.GetLayersAsFlattenedList()// .OfType<FeatureLayer>()// .Where(fl => fl.ShapeType == esriGeometryType.esriGeometryPoint);// await ApplySymbolToFeatureLayerAsync(pointFeatureLayer.FirstOrDefault(), "Fire Station");public Task ApplySymbolToFeatureLayerAsync(FeatureLayerfeatureLayer,stringsymbolName){return QueuedTask.Run(async()=>{//Get the ArcGIS 2D System style from the ProjectvararcGIS2DStyle= Project.Current.GetItems<StyleProjectItem>().FirstOrDefault(s => s.Name =="ArcGIS 2D");//Search for the symbolName style items within the ArcGIS 2D style project item.varitems=await QueuedTask.Run(()=> arcGIS2DStyle.SearchSymbols(StyleItemType.PointSymbol, symbolName));//Gets the CIMSymbolCIMSymbolsymbol= items.FirstOrDefault().Symbol;//Get the renderer of the point feature layerCIMSimpleRendererrenderer= featureLayer.GetRenderer()as CIMSimpleRenderer;//Set symbol's real world setting to be the same as that of the feature layer symbol.SetRealWorldUnits(featureLayer.UsesRealWorldSymbolSizes);//Apply the symbol to the feature layer's current renderer renderer.Symbol = symbol.MakeSymbolReference();//Apply the renderer to the feature layer featureLayer.SetRenderer(renderer);});}
How to apply a color ramp from a style to a feature layer
await QueuedTask.Run(()=>{varmap= MapFactory.Instance.CreateMap(mapName, basemap: Basemap.ProjectDefault);//TODO: use the map...});
Find a map within a project and open it
publicstaticasyncTask<Map>FindOpenExistingMapAsync(stringmapName){returnawait QueuedTask.Run(async()=>{Mapmap=null;Projectproj= Project.Current;//Finding the first project item with name matches with mapNameMapProjectItemmpi= proj.GetItems<MapProjectItem>().FirstOrDefault(m => m.Name.Equals(mapName, StringComparison.CurrentCultureIgnoreCase));if(mpi!=null){map= mpi.GetMap();//Opening the map in a mapviewawait ProApp.Panes.CreateMapPaneAsync(map);}returnmap;});}
Open a webmap
Mapmap=null;//Assume we get the selected webmap from the Project pane's Portal tabif(Project.Current.SelectedItems.Count >0){if(MapFactory.Instance.CanCreateMapFrom(Project.Current.SelectedItems[0])){map= MapFactory.Instance.CreateMapFromItem(Project.Current.SelectedItems[0]);await ProApp.Panes.CreateMapPaneAsync(map);}}
Get Map Panes
publicstaticIEnumerable<IMapPane>GetMapPanes(){//Sorted by Map Urireturn ProApp.Panes.OfType<IMapPane>().OrderBy((mp)=> mp.MapView.Map.URI ?? mp.MapView.Map.Name);}
Get the Unique List of Maps From the Map Panes
publicstaticIReadOnlyList<Map>GetMapsFromMapPanes(){//Gets the unique list of Maps from all the MapPanes.//Note: The list of maps retrieved from the MapPanes//maybe less than the total number of Maps in the project.//It depends on what maps the user has actually opened.varmapPanes= ProApp.Panes.OfType<IMapPane>().GroupBy((mp)=> mp.MapView.Map.URI).Select(grp => grp.FirstOrDefault());List<Map>uniqueMaps=newList<Map>();foreach(var pane in mapPanes)
uniqueMaps.Add(pane.MapView.Map);returnuniqueMaps;}
Change the Map name
MapView.Active.Map.SetName("Test");
Renames the caption of the pane
ProApp.Panes.ActivePane.Caption ="Caption";
Convert Map to Local Scene
//Note: Run within the context of QueuedTask.RunboolcanConvertMap= MapFactory.Instance.CanConvertMap(map, MapConversionType.SceneLocal);if(canConvertMap)
MapFactory.Instance.ConvertMap(map, MapConversionType.SceneLocal,true);
Get Basemaps
//Basemaps stored locally in the project. This is usually an empty collectionstringlocalBasemapTypeID="cim_map_basemap";varlocalBasemaps=await QueuedTask.Run(()=>{varmapContainer= Project.Current.GetProjectItemContainer("Map");return mapContainer.GetItems().Where(i => i.TypeID ==localBasemapTypeID).ToList();});//portal basemaps. If there is no current active portal, the usual default//is arcgis onlinevarportal= ArcGISPortalManager.Current.GetActivePortal();varportalBaseMaps=await portal.GetBasemapsAsync();//use one of them...local or portal...//var map = MapView.Active.Map;//QueuedTask.Run(() => map?.SetBasemapLayers(portalBaseMaps[0]));
Save Map as MapX
map.SaveAsFile(@"C:\Data\MyMap.mapx",true);
Save 2D Map as WebMap on Disk
//2D maps only//Must be on the QueuedTask.Run(...)if(map.DefaultViewingMode == MapViewingMode.Map)//Only webmap compatible layers will be saved out to the file
map.SaveAsWebMapFile(@"C:\Data\MyMap.json");
Clip Map to the provided clip polygon
//Run within QueuedTaskvarmap= MapView.Active.Map;//A layer to use for the clip extentvarlyrOfInterest= MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().Where(l => l.Name =="TestPoly").FirstOrDefault();//Get the polygon to use to clip the mapvarextent= lyrOfInterest.QueryExtent();varpolygonForClipping= PolygonBuilderEx.CreatePolygon(extent);//Clip the map using the layer's extent
map.SetClipGeometry(polygonForClipping,
SymbolFactory.Instance.ConstructLineSymbol(
SymbolFactory.Instance.ConstructStroke(
ColorFactory.Instance.BlueRGB,2.0, SimpleLineStyle.Dash)));
Clear the current map clip geometry
//Run within QueuedTaskvarmap= MapView.Active.Map;//Clear the Map clip.//If no clipping is set then this is a no-op.
map.ClearClipGeometry();
Get the map clipping geometry
varmap= MapView.Active.Map;//If clipping is set to ArcGIS.Core.CIM.ClippingMode.None or ArcGIS.Core.CIM.ClippingMode.MapSeries null is returned//If clipping is set to ArcGIS.Core.CIM.ClippingMode.MapExtent the ArcGIS.Core.CIM.CIMMap.CustomFullExtent is returned.//Otherwise, if clipping is set to ArcGIS.Core.CIM.ClippingMode.CustomShape the custom clip polygon is returned.varpoly= map.GetClipGeometry();//You can use the polygon returned//For example: We make a polygon graphic element and add it to a Graphics Layer.vargl= map.GetLayersAsFlattenedList().OfType<GraphicsLayer>().FirstOrDefault();if(gl==null)return;varpolygonSymbol= SymbolFactory.Instance.ConstructPolygonSymbol(CIMColor.CreateRGBColor(255,255,0));varcimGraphicElement=new CIMPolygonGraphic
{Polygon=poly,Symbol= polygonSymbol.MakeSymbolReference()};
gl.AddElement(cimGraphicElement);
Get the Current Map Location Unit
//var map = MapView.Active.Map;//Must be on the QueuedTask.Run()//Get the current location unitvarloc_unit= map.GetLocationUnitFormat();varline=$"{loc_unit.DisplayName}, {loc_unit.UnitCode}";
System.Diagnostics.Debug.WriteLine(line);
Get the Available List of Map Location Units
//var map = MapView.Active.Map;//Must be on the QueuedTask.Run()//Linear location unit formats are not included if the map sr//is geographic.varloc_units= map.GetAvailableLocationUnitFormats();
Format a Location Using the Current Map Location Unit
varmv= MapView.Active;varmap= mv.Map;
QueuedTask.Run(()=>{//Get the current view camera locationvarcenter_pt=new Coordinate2D(mv.Camera.X, mv.Camera.Y);//Get the current location unitvarloc_unit= map.GetLocationUnitFormat();//Format the camera locationvarstr= loc_unit.FormatLocation(center_pt, map.SpatialReference); System.Diagnostics.Debug.WriteLine($"Formatted location: {str}");});
Set the Location Unit for the Current Map
varmv= MapView.Active;varmap= mv.Map;
QueuedTask.Run(()=>{//Get the list of available location unit formats//for the current mapvarloc_units= map.GetAvailableLocationUnitFormats();//arbitrarily use the last unit in the list map.SetLocationUnitFormat(loc_units.Last());});
Get the Current Map Elevation Unit
//var map = MapView.Active.Map;//Must be on the QueuedTask.Run()//If the map is not a scene, the default Project distance//unit will be returnedvarelev_unit= map.GetElevationUnitFormat();varline=$"{elev_unit.DisplayName}, {elev_unit.UnitCode}";
System.Diagnostics.Debug.WriteLine(line);
Get the Available List of Map Elevation Units
//var map = MapView.Active.Map;//Must be on the QueuedTask.Run()//If the map is not a scene, the list of current//Project distance units will be returnedvarelev_units= map.GetAvailableElevationUnitFormats();
Format an Elevation Using the Current Map Elevation Unit
varmv= MapView.Active;varmap= mv.Map;
QueuedTask.Run(()=>{//Get the current elevation unit. If the map is not//a scene the default Project distance unit is returnedvarelev_unit= map.GetElevationUnitFormat();//Format the view camera elevationvarstr= elev_unit.FormatValue(mv.Camera.Z); System.Diagnostics.Debug.WriteLine($"Formatted elevation: {str}");});
Set the Elevation Unit for the Current Map
varmap= MapView.Active.Map;
QueuedTask.Run(()=>{//Trying to set the elevation unit on a map other than//a scene will throw an InvalidOperationExceptionif(map.IsScene){//Get the list of available elevation unit formats//for the current mapvarloc_units= map.GetAvailableElevationUnitFormats();//arbitrarily use the last unit in the list map.SetElevationUnitFormat(loc_units.Last());}});
Offline Map
Check Map Has Sync-Enabled Content
//namespace ArcGIS.Desktop.Mapping.Offlinevarmap= MapView.Active.Map;//await if needed...
QueuedTask.Run(()=>{varhasSyncEnabledContent= GenerateOfflineMap.Instance.GetCanGenerateReplicas(map);if(hasSyncEnabledContent){//TODO - use status...}});
Generate Replicas for Sync-Enabled Content
//namespace ArcGIS.Desktop.Mapping.Offlinevarextent= MapView.Active.Extent;varmap= MapView.Active.Map;//await if needed...
QueuedTask.Run(()=>{//Check map has sync-enabled content that can be taken offlinevarhasSyncEnabledContent= GenerateOfflineMap.Instance.GetCanGenerateReplicas(map);if(hasSyncEnabledContent){//Generate Replicas and take the content offline//sync-enabled content gets copied local into a SQLite DBvargen_params=new GenerateReplicaParams(){Extent=extent,//SR of extent must match map SR//DestinationFolder can be left blank, if specified,//it must exist. Defaults to project offline maps locationDestinationFolder=@"C:\Data\Offline"};//Sync-enabled layer content will be resourced to point to the//local replica content. GenerateOfflineMap.Instance.GenerateReplicas(map, gen_params);}});
Check Map Has Local Syncable Content
//namespace ArcGIS.Desktop.Mapping.Offlinevarmap= MapView.Active.Map;//await if needed...
QueuedTask.Run(()=>{//Check map has local syncable contentvarcanSyncContent= GenerateOfflineMap.Instance.GetCanSynchronizeReplicas(map);if(canSyncContent){//TODO - use status}});
Synchronize Replicas for Syncable Content
//namespace ArcGIS.Desktop.Mapping.Offlinevarmap= MapView.Active.Map;//await if needed...
QueuedTask.Run(()=>{//Check map has local syncable contentvarcanSyncContent= GenerateOfflineMap.Instance.GetCanSynchronizeReplicas(map);if(canSyncContent){//Sync Replicas - changes since last sync are pushed to the//parent replica. Parent changes are pulled to the client.//Unsaved edits are _not_ sync'd. GenerateOfflineMap.Instance.SynchronizeReplicas(map);}});
Remove Replicas for Syncable Content
//namespace ArcGIS.Desktop.Mapping.Offlinevarextent= MapView.Active.Extent;varmap= MapView.Active.Map;//await if needed...
QueuedTask.Run(()=>{//Check map has local syncable content//Either..//var canSyncContent = GenerateOfflineMap.Instance.GetCanSynchronizeReplicas(map);//Or...both accomplish the same thing...varcanRemove= GenerateOfflineMap.Instance.GetCanRemoveReplicas(map);if(canRemove){//Remove Replicas - any unsync'd changes are lost//Call sync _first_ to push any outstanding changes if//needed. Local syncable content is re-sourced//to point to the service GenerateOfflineMap.Instance.RemoveReplicas(map);}});
Export Map Raster Tile Cache Content
//namespace ArcGIS.Desktop.Mapping.Offlinevarextent= MapView.Active.Extent;varmap= MapView.Active.Map;//await if needed...
QueuedTask.Run(()=>{//Does the map have any exportable raster content?varcanExport= GenerateOfflineMap.Instance.GetCanExportRasterTileCache(map);if(canExport){//Check the available LOD scale rangesvarscales= GenerateOfflineMap.Instance.GetExportRasterTileCacheScales(map, extent);//Pick the desired LOD scalevarmax_scale= scales[scales.Count()/2];//Configure the export parametersvarexport_params=new ExportTileCacheParams(){Extent=extent,//Use same extent as was used to retrieve scalesMaximumUserDefinedScale=max_scale//DestinationFolder = .... (optional)};//If DestinationFolder is not set, output defaults to project//offline maps location set in the project properties. If that is //not set, output defaults to the current project folder location.//Do the export. Depending on the MaximumUserDefinedScale and the//area of the extent requested, this can take minutes for tile packages//over 1 GB or less if your network speed is slow... GenerateOfflineMap.Instance.ExportRasterTileCache(map, export_params);}});
Export Map Vector Tile Cache Content
//namespace ArcGIS.Desktop.Mapping.Offlinevarextent= MapView.Active.Extent;varmap= MapView.Active.Map;//await if needed...
QueuedTask.Run(()=>{//Does the map have any exportable vector tile content?varcanExport= GenerateOfflineMap.Instance.GetCanExportVectorTileCache(map);if(canExport){//Check the available LOD scale rangesvarscales= GenerateOfflineMap.Instance.GetExportVectorTileCacheScales(map, extent);//Pick the desired LOD scalevarmax_scale= scales[scales.Count()/2];//Configure the export parametersvarexport_params=new ExportTileCacheParams(){Extent=extent,//Use same extent as was used to retrieve scalesMaximumUserDefinedScale=max_scale,DestinationFolder=@"C:\Data\Offline"};//If DestinationFolder is not set, output defaults to project//offline maps location set in the project properties. If that is //not set, output defaults to the current project folder location.//Do the export. Depending on the MaximumUserDefinedScale and the//area of the extent requested, this can take minutes for tile packages//over 1 GB or less if your network speed is slow... GenerateOfflineMap.Instance.ExportVectorTileCache(map, export_params);}});
Create Layer
Create and add a layer to the active map
/** string url = @"c:\data\project.gdb\DEM"; //Raster dataset from a FileGeodatabase* string url = @"c:\connections\mySDEConnection.sde\roads"; //FeatureClass of a SDE* string url = @"c:\connections\mySDEConnection.sde\States\roads"; //FeatureClass within a FeatureDataset from a SDE* string url = @"c:\data\roads.shp"; //Shapefile* string url = @"c:\data\imagery.tif"; //Image from a folder* string url = @"c:\data\mySDEConnection.sde\roads"; //.lyrx or .lpkx file* string url = @"c:\data\CAD\Charlottesville\N1W1.dwg\Polyline"; //FeatureClass in a CAD dwg file* string url = @"C:\data\CAD\UrbanHouse.rvt\Architectural\Windows"; //Features in a Revit file* string url = @"http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer"; //map service* string url = @"http://sampleserver6.arcgisonline.com/arcgis/rest/services/NapervilleShelters/FeatureServer/0"; //FeatureLayer off a map service or feature service*/stringurl=@"c:\data\project.gdb\roads";//FeatureClass of a FileGeodatabaseUriuri=new Uri(url);await QueuedTask.Run(()=> LayerFactory.Instance.CreateLayer(uri, MapView.Active.Map));
Create layer with create-params
varflyrCreatnParam=new FeatureLayerCreationParams(new Uri(@"c:\data\world.gdb\cities")){Name="World Cities",IsVisible=false,MinimumScale=1000000,MaximumScale=5000,// At 2.x - DefinitionFilter = new CIMDefinitionFilter()//{// DefinitionExpression = "Population > 100000",// Name = "More than 100k"//},DefinitionQuery=new DefinitionQuery(whereClause:"Population > 100000", name:"More than 100k"),RendererDefinition=new SimpleRendererDefinition(){SymbolTemplate= SymbolFactory.Instance.ConstructPointSymbol(
CIMColor.CreateRGBColor(255,0,0),8, SimpleMarkerStyle.Hexagon).MakeSymbolReference()}};varfeatureLayer= LayerFactory.Instance.CreateLayer<FeatureLayer>(
flyrCreatnParam, map);
Create FeatureLayer and add to Map using LayerCreationParams
//Note: Call within QueuedTask.Run()varlayerDoc=new LayerDocument(@"E:\Data\SDK\Default2DPointSymbols.lyrx");varcreateParams=new LayerCreationParams(layerDoc.GetCIMLayerDocument());
LayerFactory.Instance.CreateLayer<FeatureLayer>(createParams, MapView.Active.Map);
Create FeatureLayer and set to not display in Map.
//The catalog path of the feature layer to add to the mapvarfeatureClassUriVisibility=new Uri(@"C:\Data\Admin\AdminData.gdb\USA\cities");//Define the Feature Layer's parameters.varlayerParamsVisibility=new FeatureLayerCreationParams(featureClassUriVisibility){//Set visibilityIsVisible=false,};//Create the layer with the feature layer parameters and add it to the active mapvarcreatedFC= LayerFactory.Instance.CreateLayer<FeatureLayer>(layerParamsVisibility, MapView.Active.Map);
Create FeatureLayer with a Renderer
//Note: Call within QueuedTask.Run()//Define a simple renderer to draw the Point US Cities feature class.varsimpleRender=new SimpleRendererDefinition
{SymbolTemplate= SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.RedRGB,4.0, SimpleMarkerStyle.Circle).MakeSymbolReference()};//The catalog path of the feature layer to add to the mapvarfeatureClassUri=new Uri(@"C:\Data\Admin\AdminData.gdb\USA\cities");//Define the Feature Layer's parameters.varlayerParams=new FeatureLayerCreationParams(featureClassUri){//Set visibilityIsVisible=true,//Set RendererRendererDefinition=simpleRender,};//Create the layer with the feature layer parameters and add it to the active mapvarcreatedFCWithRenderer= LayerFactory.Instance.CreateLayer<FeatureLayer>(layerParams, MapView.Active.Map);
Create FeatureLayer with a Query Definition
//The catalog path of the feature layer to add to the mapvarfeatureClassUriDefinition=new Uri(@"C:\Data\Admin\AdminData.gdb\USA\cities");//Define the Feature Layer's parameters.//At 2.x - var layerParamsQueryDefn = new FeatureLayerCreationParams(featureClassUriDefinition)//{// IsVisible = true,// DefinitionFilter = new CIMDefinitionFilter()// {// Name = "CACities",// DefinitionExpression = "STATE_NAME = 'California'"// }//};varlayerParamsQueryDefn=new FeatureLayerCreationParams(featureClassUriDefinition){IsVisible=true,DefinitionQuery=new DefinitionQuery(whereClause:"STATE_NAME = 'California'", name:"CACities")};//Create the layer with the feature layer parameters and add it to the active mapvarcreatedFCWithQueryDefn= LayerFactory.Instance.CreateLayer<FeatureLayer>(layerParamsQueryDefn, MapView.Active.Map);
Create multiple layers
varuriShp=new Uri(@"c:\data\roads.shp");varuriSde=new Uri(@"c:\MyDataConnections\MySDE.sde\Census");varuri=new Uri(@"http://sampleserver6.arcgisonline.com/arcgis/rest/services/NapervilleShelters/FeatureServer/0");varuris=newList<Uri>(){ uriShp, uriSde, uri };varlayers= LayerFactory.Instance.CreateLayers(uris, MapView.Active.Map);
Create mutliple layers with BulkLayerCreationParams
varuriShp=new Uri(@"c:\data\roads.shp");varuriSde=new Uri(@"c:\MyDataConnections\MySDE.sde\Census");varuri=new Uri(@"http://sampleserver6.arcgisonline.com/arcgis/rest/services/NapervilleShelters/FeatureServer/0");varuris=newList<Uri>(){ uriShp, uriSde, uri };;// set the index and visibilityvarblkParams=new BulkLayerCreationParams(uris);
blkParams.MapMemberPosition = MapMemberPosition.Index;
blkParams.MapMemberIndex =2;
blkParams.IsVisible =false;varlayers= LayerFactory.Instance.CreateLayers(blkParams, MapView.Active.Map);}
Add a GeoPackage to the Map
stringpathToGeoPackage=@"C:\Data\Geopackage\flooding.gpkg";//Create lists to hold the URIs of the layers and tables in the geopackagevarlayerUris=newList<Uri>();vartableUris=newList<Uri>();//Create an item from the geopackagevaritem= ItemFactory.Instance.Create(pathToGeoPackage, ItemFactory.ItemType.PathItem);varchildren= item.GetItems();//Collect the table and spatial data in the geopackageforeach(var child in children){varchildPath= child.Path;if(child.TypeID =="sqlite_table")
tableUris.Add(new Uri(childPath));else
layerUris.Add(new Uri(childPath));}//Add the spatial data in the geopackage using the BulkLayerCreationParamsif(layerUris.Count >0){BulkLayerCreationParamsbulklcp=new BulkLayerCreationParams(layerUris);
LayerFactory.Instance.CreateLayers(bulklcp, MapView.Active.Map);}// add the tables separatelyforeach(var tableUri in tableUris){
StandaloneTableFactory.Instance.CreateStandaloneTable(tableUri, MapView.Active.Map);}
Create TopologyLayer with an Uri pointing to a Topology dataset
//Note: Call within QueuedTask.Run()//Get the Topology of another Topology layervarexistingTopology= MapView.Active.Map.GetLayersAsFlattenedList().OfType<TopologyLayer>().FirstOrDefault();if(existingTopology!=null){vartopology= existingTopology.GetTopology();//Configure the settings for a new Catalog layer using the CatalogDataset of an existing layervartopologyLyrParams=new TopologyLayerCreationParams(topology);
topologyLyrParams.Name ="NewTopologyLayerFromAnotherTopologyLayer";
topologyLyrParams.AddAssociatedLayers =true;
LayerFactory.Instance.CreateLayer<TopologyLayer>(topologyLyrParams, MapView.Active.Map);}
Create Catalog Layer using Uri to a Catalag Feature Class
//Note: Call within QueuedTask.Run()varcreateParams=new CatalogLayerCreationParams(new Uri(@"C:\CatalogLayer\CatalogDS.gdb\HurricaneCatalogDS"));//Set the definition query
createParams.DefinitionQuery =new DefinitionQuery("Query1","cd_itemname = 'PuertoRico'");//Set name of the new Catalog Layer
createParams.Name ="PuertoRico";//Create LayervarcatalogLayer= LayerFactory.Instance.CreateLayer<CatalogLayer>(createParams, MapView.Active.Map);
Create Catalog Layer using CatalogDataset
//Note: Call within QueuedTask.Run()//Get the CatalogDataset of another Catalog layervarexistingCatalogLayer= MapView.Active.Map.GetLayersAsFlattenedList().OfType<CatalogLayer>().FirstOrDefault();if(existingCatalogLayer!=null){varcatalogDataset= existingCatalogLayer.GetCatalogDataset();//Configure the settings for a new Catalog layer using the CatalogDataset of an existing layervarcatalogLyrParams=new CatalogLayerCreationParams(catalogDataset);
catalogLyrParams.Name ="NewCatalogLayerFromAnotherCatalogLayer";
catalogLyrParams.DefinitionQuery =new DefinitionQuery("Query1","cd_itemname = 'Asia'");
LayerFactory.Instance.CreateLayer<CatalogLayer>(catalogLyrParams, MapView.Active.Map);}
Add MapNotes to the active map
//Gets the collection of layer template packages installed with Pro for use with mapsvaritems= MapView.Active.Map.LayerTemplatePackages;//Iterate through the collection of items to add each Map Note to the active mapforeach(var item in items){//Create a parameter item for the map notevarlayer_params=new LayerCreationParams(item);
layer_params.IsVisible =false;await QueuedTask.Run(()=>{//Create a feature layer for the map notevarlayer= LayerFactory.Instance.CreateLayer<Layer>(layer_params, MapView.Active.Map);});}
Apply Symbology from a Layer in the TOC
//Note: Call within QueuedTask.Run()if(MapView.Active.Map ==null)return;//Get an existing Layer. This layer has a symbol you want to use in a new layer.varlyr= MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().Where(l => l.ShapeType == esriGeometryType.esriGeometryPoint).FirstOrDefault();//This is the renderer to use in the new Layervarrenderer= lyr.GetRenderer()as CIMSimpleRenderer;//Set the DataConnection for the new layerGeodatabasegeodatabase=new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(@"E:\Data\Admin\AdminData.gdb")));FeatureClassfeatureClass= geodatabase.OpenDataset<FeatureClass>("Cities");vardataConnection= featureClass.GetDataConnection();//Create the definition for the new feature layervarfeatureLayerParams=new FeatureLayerCreationParams(dataConnection){RendererDefinition=new SimpleRendererDefinition(renderer.Symbol),IsVisible=true,};//create the new layer
LayerFactory.Instance.CreateLayer<FeatureLayer>(
featureLayerParams, MapView.Active.Map);
Create a new SubTypeGroupLayer
varsubtypeGroupLayerCreateParam=new SubtypeGroupLayerCreationParams
(new Uri(@"c:\data\SubtypeAndDomain.gdb\Fittings"));// Define Subtype layers//At 2.x - var rendererDefn1 = new UniqueValueRendererDefinition(new string[] { "type" });varrendererDefn1=new UniqueValueRendererDefinition(newList<string>{"type"});varrenderDefn2=new SimpleRendererDefinition(){SymbolTemplate= SymbolFactory.Instance.ConstructPointSymbol(
CIMColor.CreateRGBColor(255,0,0),8, SimpleMarkerStyle.Hexagon).MakeSymbolReference()};
subtypeGroupLayerCreateParam.SubtypeLayers =newList<SubtypeFeatureLayerCreationParams>(){//define first subtype layer with unique value renderer//At 2.x - new SubtypeFeatureLayerCreationParams(new UniqueValueRendererDefinition(new string[] { "type" }), 1),new SubtypeFeatureLayerCreationParams(new UniqueValueRendererDefinition(newList<string>{"type"}),1),//define second subtype layer with simple symbol renderernew SubtypeFeatureLayerCreationParams(renderDefn2,2)};// Define additional parameters//At - 2.x subtypeGroupLayerCreateParam.DefinitionFilter = new CIMDefinitionFilter()//{// Name = "IsActive",// DefinitionExpression = "Enabled = 1"//};
subtypeGroupLayerCreateParam.DefinitionQuery =new DefinitionQuery(whereClause:"Enabled = 1", name:"IsActive");
subtypeGroupLayerCreateParam.IsVisible =true;
subtypeGroupLayerCreateParam.MinimumScale =50000;SubtypeGroupLayersubtypeGroupLayer2= LayerFactory.Instance.CreateLayer<SubtypeGroupLayer>(
subtypeGroupLayerCreateParam, MapView.Active.Map);
Create layer from a lyrx file
varlyrDocFromLyrxFile=new LayerDocument(@"d:\data\cities.lyrx");varcimLyrDoc= lyrDocFromLyrxFile.GetCIMLayerDocument();//modifying its renderer symbol to redvarr=((CIMFeatureLayer)cimLyrDoc.LayerDefinitions[0]).Renderer as CIMSimpleRenderer;
r.Symbol.Symbol.SetColor(new CIMRGBColor(){R=255});//optionally save the updates out as a file
lyrDocFromLyrxFile.Save(@"c:\data\cities_red.lyrx");//get a json representation of the layer document and you want store away...varaJSONString= lyrDocFromLyrxFile.AsJson();//... and load it back when needed
lyrDocFromLyrxFile.Load(aJSONString);cimLyrDoc= lyrDocFromLyrxFile.GetCIMLayerDocument();//create a layer and add it to a mapvarlcp=new LayerCreationParams(cimLyrDoc);varlyr= LayerFactory.Instance.CreateLayer<FeatureLayer>(lcp, map);
Apply Symbology to a layer from a Layer file
//Note: Run within QueuedTask.Run//Get the Layer Document from the lyrx filevarlyrDocFromLyrxFile=new LayerDocument(layerFile);varcimLyrDoc= lyrDocFromLyrxFile.GetCIMLayerDocument();//Get the renderer from the layer filevarrendererFromLayerFile=((CIMFeatureLayer)cimLyrDoc.LayerDefinitions[0]).Renderer as CIMUniqueValueRenderer;//Apply the renderer to the feature layer//Note: If working with a raster layer, use the SetColorizer method.
featureLayer?.SetRenderer(rendererFromLayerFile);
Add a WMS service
// Create a connection to the WMS servervarserverConnection=new CIMInternetServerConnection {URL="URL of the WMS service"};varconnection=new CIMWMSServiceConnection {ServerConnection=serverConnection};// Add a new layer to the mapvarlayerParams=new LayerCreationParams(connection);await QueuedTask.Run(()=>{varlayer= LayerFactory.Instance.CreateLayer<FeatureLayer>(layerParams, MapView.Active.Map);});
Add a WFS Service
CIMStandardDataConnectioncIMStandardDataConnection=new CIMStandardDataConnection(){WorkspaceConnectionString=@"SWAPXY=TRUE;SWAPXYFILTER=FALSE;URL=http://sampleserver6.arcgisonline.com/arcgis/services/SampleWorldCities/MapServer/WFSServer;VERSION=2.0.0",WorkspaceFactory= WorkspaceFactory.WFS,Dataset="Continent",DatasetType= esriDatasetType.esriDTFeatureClass
};// Add a new layer to the mapvarlayerPamsDC=new LayerCreationParams(cIMStandardDataConnection);await QueuedTask.Run(()=>{Layerlayer= LayerFactory.Instance.CreateLayer<FeatureLayer>(layerPamsDC, MapView.Active.Map);});
Adding and changing styles for WMS Service Layer
varserverConnection=new CIMInternetServerConnection {URL="https://spritle.esri.com/arcgis/services/sanfrancisco_sld/MapServer/WMSServer"};varconnection=new CIMWMSServiceConnection {ServerConnection=serverConnection};LayerCreationParamsparameters=new LayerCreationParams(connection);
parameters.MapMemberPosition = MapMemberPosition.AddToBottom;await QueuedTask.Run(()=>{varcompositeLyr= LayerFactory.Instance.CreateLayer<WMSLayer>(parameters, MapView.Active.Map);//wms layer in ArcGIS Pro always has a composite layer inside itvarwmsLayers= compositeLyr.Layers[0]as ServiceCompositeSubLayer;//each wms sublayer belongs in that composite layervarhighwayLayerWMSSub= wmsLayers.Layers[1]as WMSSubLayer;//toggling a sublayer's visibilityif((highwayLayerWMSSub!=null)){boolvisibility= highwayLayerWMSSub.IsVisible; highwayLayerWMSSub.SetVisibility(!visibility);}//applying an existing style to a wms sub layervarpizzaLayerWMSSub= wmsLayers.Layers[0]as WMSSubLayer;varcurrentStyles= pizzaLayerWMSSub.GetStyleNames(); pizzaLayerWMSSub.SetStyleName(currentStyles[1]);});
//Get an existing Layer. This layer has a symbol you want to use in a new layer.varlyr= MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().Where(l => l.ShapeType == esriGeometryType.esriGeometryPoint).FirstOrDefault();
Find a layer
//Finds layers by name and returns a read only list of LayersIReadOnlyList<Layer>layers= aMap.FindLayers("cities",true);//Finds a layer using a URI.//The Layer URI you pass in helps you search for a specific layer in a mapvarlyrFindLayer= MapView.Active.Map.FindLayer("CIMPATH=map/u_s__states__generalized_.xml");//This returns a collection of layers of the "name" specified. You can use any Linq expression to query the collection. varlyrExists= MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().Any(f => f.Name =="U.S. States (Generalized)");
Find a standalone table
// these routines find a standalone table whether it is a child of the Map or a GroupLayervartblFind= aMap.FindStandaloneTable("CIMPATH=map/address_audit.xml");IReadOnlyList<StandaloneTable>tables= aMap.FindStandaloneTables("addresses");// this method finds a standalone table as a child of the map onlyvartable= aMap.StandaloneTables.FirstOrDefault(t => t.Name =="Addresses");
varfeatureLayer= MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{// get the CIM definition from the layervarcimFeatureDefinition= featureLayer.GetDefinition()as ArcGIS.Core.CIM.CIMBasicFeatureLayer;// get the view of the source table underlying the layervarcimDisplayTable= cimFeatureDefinition.FeatureTable;// this field is used as the 'label' to represent the rowvardisplayField= cimDisplayTable.DisplayField;});
Enable labeling on a layer
varfeatureLayer= MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{// toggle the label visibility featureLayer.SetLabelVisibility(!featureLayer.IsLabelVisible);});
Set Elevation Mode for a layer
//Note: Use QueuedTask.RunElevationTypeDefinitionelevationTypeDefinition= featureLayer.GetElevationTypeDefinition();
elevationTypeDefinition.ElevationType = LayerElevationType.OnGround;//elevationTypeDefinition.ElevationType = LayerElevationType.RelativeToGround;//elevationTypeDefinition.ElevationType = LayerElevationType.RelativeToScene;//elevationTypeDefinition.ElevationType = LayerElevationType.AtAbsoluteHeight;//..so on.//Optional: Specify the cartographic offset
elevationTypeDefinition.CartographicOffset =1000;//Optional: Specify the VerticalExaggeration
elevationTypeDefinition.VerticalExaggeration =2;if(featureLayer.CanSetElevationTypeDefinition(elevationTypeDefinition))
featureLayer.SetElevationTypeDefinition(elevationTypeDefinition);
Move a layer in the 2D group to the 3D Group in a Local Scene
//The layer in the 2D group to move to the 3D Group in a Local Scenevarlayer= MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
QueuedTask.Run(()=>{//Get the layer's definitionvarlyrDefn= layer.GetDefinition()as CIMBasicFeatureLayer;//setting this property moves the layer to 3D group in a scene lyrDefn.IsFlattened =false;//Set the definition back to the layer layer.SetDefinition(lyrDefn);});
Change the underlying data source of a feature layer - same workspace type
//This is the existing layer for which we want to switch the underlying datasourcevarlyr= MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
QueuedTask.Run(()=>{varconnectionStringToReplace= lyr.GetFeatureClass().GetDatastore().GetConnectionString();stringdatabaseConnectionPath=@"Path to the .sde connection file to replace with";//If the new SDE connection did not have a dataset with the same name as in the feature layer,//pass false for the validate parameter of the FindAndReplaceWorkspacePath method to achieve this. //If validate is true and the SDE did not have a dataset with the same name, //FindAndReplaceWorkspacePath will return failure lyr.FindAndReplaceWorkspacePath(connectionStringToReplace, databaseConnectionPath,true);});
Change Geodatabase Version of layers off a specified version in a map
await QueuedTask.Run(()=>{//Getting the current version name from the first feature layer of the mapFeatureLayerflyr= MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();//first feature layerDatastoredataStore= flyr.GetFeatureClass().GetDatastore();//getting datasourceGeodatabasegeodatabase= dataStore as Geodatabase;//casting to Geodatabaseif(geodatabase==null)return;VersionManagerversionManager= geodatabase.GetVersionManager(); ArcGIS.Core.Data.Version currentVersion= versionManager.GetCurrentVersion();//Getting all available versions except the current oneIEnumerable<ArcGIS.Core.Data.Version>versions= versionManager.GetVersions().Where(v =>!v.GetName().Equals(currentVersion.GetName(), StringComparison.CurrentCultureIgnoreCase));//Assuming there is at least one other version we pick the first one from the list ArcGIS.Core.Data.Version toVersion= versions.FirstOrDefault();if(toVersion!=null){//Changing version MapView.Active.Map.ChangeVersion(currentVersion, toVersion);}});
Querying a feature layer
varcount=await QueuedTask.Run(()=>{QueryFilterqf=new QueryFilter(){WhereClause="Class = 'city'"};//Getting the first selected feature layer of the map viewvarflyr=(FeatureLayer)MapView.Active.GetSelectedLayers().OfType<FeatureLayer>().FirstOrDefault();using(RowCursorrows= flyr.Search(qf))//execute{//Looping through to countinti=0;while(rows.MoveNext())i++;returni;}});
MessageBox.Show(String.Format("Total features that matched the search criteria: {0}", count));
Get the attribute rotation field of a layer
varfeatureLayer= MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
QueuedTask.Run(()=>{varcimRenderer= featureLayer.GetRenderer()as CIMUniqueValueRenderer;varcimRotationVariable= cimRenderer.VisualVariables.OfType<CIMRotationVisualVariable>().FirstOrDefault();varrotationInfoZ= cimRotationVariable.VisualVariableInfoZ;varrotationExpression= rotationInfoZ.ValueExpressionInfo.Expression;// this expression stores the field name });
Find connected attribute field for rotation
varfeatureLayer= MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{// get the CIM renderer from the layervarcimRenderer= featureLayer.GetRenderer()as ArcGIS.Core.CIM.CIMSimpleRenderer;// get the collection of connected attributes for rotationvarcimRotationVariable= cimRenderer.VisualVariables.OfType<ArcGIS.Core.CIM.CIMRotationVisualVariable>().FirstOrDefault();// the z direction is describing the heading rotationvarrotationInfoZ= cimRotationVariable.VisualVariableInfoZ;varrotationExpression= rotationInfoZ.Expression;// this expression stores the field name });
Toggle "Scale layer symbols when reference scale is set"
varfeatureLayer= MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{// get the CIM layer definitionvarcimFeatureLayer= featureLayer.GetDefinition()as ArcGIS.Core.CIM.CIMFeatureLayer;// turn on the option to scale the symbols in this layer based in the map's reference scale cimFeatureLayer.ScaleSymbols =true;});
Set the layer cache
varfeatureLayer= MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{// change the layer cache type to maximum age//At 2.x - featureLayer.SetDisplayCacheType(ArcGIS.Core.CIM.DisplayCacheType.MaxAge); featureLayer.SetCacheOptions(LayerCacheType.MaxAge);// change from the default 5 min to 2 min featureLayer.SetDisplayCacheMaxAge(TimeSpan.FromMinutes(2));});
Change the layer selection color
varfeatureLayer= MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{// get the CIM definition of the layervarlayerDef= featureLayer.GetDefinition()as ArcGIS.Core.CIM.CIMBasicFeatureLayer;// disable the default symbol layerDef.UseSelectionSymbol =false;// assign a new color layerDef.SelectionColor = ColorFactory.Instance.RedRGB;// apply the definition to the layer featureLayer.SetDefinition(layerDef);if(!featureLayer.IsVisible) featureLayer.SetVisibility(true);//Do a selection MapView.Active.SelectFeatures(MapView.Active.Extent);});
Removes all layers that are unchecked
varmap= MapView.Active.Map;if(map==null)return;//Get the group layers firstIReadOnlyList<GroupLayer>groupLayers= map.Layers.OfType<GroupLayer>().ToList();//Iterate and remove the layers within the group layers that are unchecked.foreach(var groupLayer in groupLayers){//Get layers that not visible within the groupvarlayers= groupLayer.Layers.Where(l => l.IsVisible ==false).ToList();//Remove all the layers that are not visible within the groupawait QueuedTask.Run(()=> map.RemoveLayers(layers));}//Group Layers that are empty and are uncheckedforeach(var group in groupLayers){if(group.Layers.Count ==0&& group.IsVisible ==false)//No layers in the group{//remove the groupawait QueuedTask.Run(()=> map.RemoveLayer(group));}}//Get Layers that are NOT Group layers and are uncheckedvarnotAGroupAndUnCheckedLayers= map.Layers.Where(l =>!(l is GroupLayer)&& l.IsVisible ==false).ToList();//Remove all the non group layers that are not visibleawait QueuedTask.Run(()=> map.RemoveLayers(notAGroupAndUnCheckedLayers));
Remove empty groups
varmap= MapView.Active.Map;if(map==null)return;//Get the group layersIReadOnlyList<GroupLayer>groupLayers= map.Layers.OfType<GroupLayer>().ToList();foreach(var group in groupLayers){if(group.Layers.Count ==0)//No layers in the group{//remove the groupawait QueuedTask.Run(()=> map.RemoveLayer(group));}}
Create and apply Abbreviation Dictionary in the Map Definition to a layer
publicstaticvoidCreateDictionary(){//Get the map's definitionvarmapDefn= MapView.Active.Map.GetDefinition();//Get the Map's Maplex labelling engine propertiesvarmapDefnPlacementProps= mapDefn.GeneralPlacementProperties as CIMMaplexGeneralPlacementProperties;//Define the abbreviations we need in an array List<CIMMaplexDictionaryEntry>abbreviationDictionary=newList<CIMMaplexDictionaryEntry>{new CIMMaplexDictionaryEntry {Abbreviation="Hts",Text="Heights",MaplexAbbreviationType= MaplexAbbreviationType.Ending
},new CIMMaplexDictionaryEntry
{Abbreviation="Ct",Text="Text",MaplexAbbreviationType= MaplexAbbreviationType.Ending
}//etc};//The Maplex Dictionary - can hold multiple Abbreviation collectionsvarmaplexDictionary=newList<CIMMaplexDictionary>{new CIMMaplexDictionary {Name="NameEndingsAbbreviations",MaplexDictionary= abbreviationDictionary.ToArray()}};//Set the Maplex Label Engine Dictionary property to the Maplex Dictionary collection created above.
mapDefnPlacementProps.Dictionaries = maplexDictionary.ToArray();//Set the Map definition
MapView.Active.Map.SetDefinition(mapDefn);}privatestaticvoidApplyDictionary(){varfeatureLayer= MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().First();
QueuedTask.Run(()=>{//Creates Abbreviation dictionary and adds to Map Definition CreateDictionary();//Get the layer's definitionvarlyrDefn= featureLayer.GetDefinition()as CIMFeatureLayer;//Get the label classes - we need the first onevarlistLabelClasses= lyrDefn.LabelClasses.ToList();vartheLabelClass= listLabelClasses.FirstOrDefault();//Modify label Placement props to use abbreviation dictionary CIMGeneralPlacementPropertieslabelEngine= MapView.Active.Map.GetDefinition().GeneralPlacementProperties; theLabelClass.MaplexLabelPlacementProperties.DictionaryName ="NameEndingsAbbreviations"; theLabelClass.MaplexLabelPlacementProperties.CanAbbreviateLabel =true; theLabelClass.MaplexLabelPlacementProperties.CanStackLabel =false;//Set the labelClasses back lyrDefn.LabelClasses = listLabelClasses.ToArray();//set the layer's definition featureLayer.SetDefinition(lyrDefn);});}
Attribute Table - ITablePane
Set zoom level for Attribute Table
if(FrameworkApplication.Panes.ActivePane is ITablePane tablePane){varcurrentZoomLevel= tablePane.ZoomLevel;varnewZoomLevel=currentZoomLevel+50;
tablePane.SetZoomLevel(newZoomLevel);}
Retrieve the values of selected cell in the attribute table
if(FrameworkApplication.Panes.ActivePane is ITablePane tablePane){varmapMember= tablePane.MapMember;varoid= tablePane.ActiveObjectID;if(oid.HasValue && oid.Value !=-1&&mapMember!=null){varactiveField= tablePane.ActiveColumn;return QueuedTask.Run<object>(()=>{// TODO: Use core objects to retrieve record and get valuereturnnull;});}}
Move to a particular row
if(FrameworkApplication.Panes.ActivePane is ITablePane tablePane){// move to first row
tablePane.BringIntoView(0);// move to sixth row
tablePane.BringIntoView(5);}}
Metadata
Get and Set Map Metadata
varmap= MapView.Active.Map;if(map==null)return;//Get map's metadatavarmapMetadata= map.GetMetadata();//TODO:Make edits to metadata using the retrieved mapMetadata string.//Set the modified metadata back to the map.if(map.GetCanEditMetadata())
map.SetMetadata(mapMetadata);
Layer Metadata
MapMembermapMember= map.GetLayersAsFlattenedList().FirstOrDefault();//Search for only layers/tables here if needed.if(mapMember==null)return;//Gets whether or not the MapMember stores its own metadata or uses metadata retrieved//from its source. This method must be called on the MCT. Use QueuedTask.RunbooldoesUseSourceMetadata= mapMember.GetUseSourceMetadata();//Sets whether or not the MapMember will use its own metadata or the metadata from//its underyling source (if it has one). This method must be called on the MCT.//Use QueuedTask.Run
mapMember.SetUseSourceMetadata(true);//Does the MapMember supports metadatavarsupportsMetadata= mapMember.SupportsMetadata;//Get MapMember metadatavarmetadatstring= mapMember.GetMetadata();//TODO:Make edits to metadata using the retrieved mapMetadata string.//Set the modified metadata back to the mapmember (layer, table..)if(mapMember.GetCanEditMetadata())
mapMember.SetMetadata(metadatstring);
Renderers
Set unique value renderer to the selected feature layer of the active map
await QueuedTask.Run(()=>{varfields=newList<string>{"Type"};//field to be used to retrieve unique valuesCIMPointSymbolpointSym= SymbolFactory.Instance.ConstructPointSymbol( ColorFactory.Instance.GreenRGB,16.0, SimpleMarkerStyle.Pushpin);//constructing a point symbol as a template symbolCIMSymbolReferencesymbolPointTemplate= pointSym.MakeSymbolReference();//constructing renderer definition for unique value rendererUniqueValueRendererDefinitionuniqueValueRendererDef=new UniqueValueRendererDefinition(fields, symbolPointTemplate);//creating a unique value renderervarflyr= MapView.Active.GetSelectedLayers()[0]as FeatureLayer;CIMUniqueValueRendereruniqueValueRenderer= flyr.CreateRenderer(uniqueValueRendererDef)as CIMUniqueValueRenderer;//setting the renderer to the feature layer flyr.SetRenderer(uniqueValueRenderer);});
Create a UniqueValueRenderer to specify symbols to values
return QueuedTask.Run(()=>{//The goal is to construct the CIMUniqueValueRenderer which will be applied to the feature layer.// To do this, the following are the objects we need to set the renderer up with the fields and symbols.// As a reference, this is the USCities dataset. Snippet will create a unique value renderer that applies // specific symbols to all the cities in California and Alabama. The rest of the cities will use a default symbol.// First create a "CIMUniqueValueClass" for the cities in Alabama.List<CIMUniqueValue>listUniqueValuesAlabama=newList<CIMUniqueValue>{new CIMUniqueValue {FieldValues=newstring[]{"Alabama"}}};CIMUniqueValueClassalabamaUniqueValueClass=new CIMUniqueValueClass{Editable=true,Label="Alabama",Patch= PatchShape.Default,Symbol= SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.RedRGB).MakeSymbolReference(),Visible=true,Values= listUniqueValuesAlabama.ToArray()};// Create a "CIMUniqueValueClass" for the cities in California.List<CIMUniqueValue>listUniqueValuescalifornia=newList<CIMUniqueValue>{new CIMUniqueValue {FieldValues=newstring[]{"California"}}};CIMUniqueValueClasscaliforniaUniqueValueClass=new CIMUniqueValueClass{Editable=true,Label="California",Patch= PatchShape.Default,Symbol= SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.BlueRGB).MakeSymbolReference(),Visible=true,Values= listUniqueValuescalifornia.ToArray()};//Create a list of the above two CIMUniqueValueClassesList<CIMUniqueValueClass>listUniqueValueClasses=newList<CIMUniqueValueClass>{ alabamaUniqueValueClass, californiaUniqueValueClass};//Create a list of CIMUniqueValueGroupCIMUniqueValueGroupuvg=new CIMUniqueValueGroup{Classes= listUniqueValueClasses.ToArray(),};List<CIMUniqueValueGroup>listUniqueValueGroups=newList<CIMUniqueValueGroup>{ uvg };//Create the CIMUniqueValueRendererCIMUniqueValueRendereruvr=new CIMUniqueValueRenderer{UseDefaultSymbol=true,DefaultLabel="all other values",DefaultSymbol= SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.GreyRGB).MakeSymbolReference(),Groups= listUniqueValueGroups.ToArray(),Fields=newstring[]{"STATE_NAME"}};//Set the feature layer's renderer. featureLayer.SetRenderer(uvr);});
Create a Heatmap Renderer
stringcolorBrewerSchemesName="ArcGIS Colors";StyleProjectItemstyle= Project.Current.GetItems<StyleProjectItem>().First(s => s.Name ==colorBrewerSchemesName);stringcolorRampName="Heat Map 4 - Semitransparent";IList<ColorRampStyleItem>colorRampList=await QueuedTask.Run(()=>{return style.SearchColorRamps(colorRampName);});ColorRampStyleItemcolorRamp= colorRampList[0];await QueuedTask.Run(()=>{//defining a heatmap renderer that uses values from Population field as the weightsHeatMapRendererDefinitionheatMapDef=new HeatMapRendererDefinition(){Radius=20,WeightField="Population",ColorRamp= colorRamp.ColorRamp,RendereringQuality=8,UpperLabel="High Density",LowerLabel="Low Density"};FeatureLayerflyr= MapView.Active.Map.Layers[0]as FeatureLayer;CIMHeatMapRendererheatMapRndr= flyr.CreateRenderer(heatMapDef)as CIMHeatMapRenderer; flyr.SetRenderer(heatMapRndr);});
Create an Unclassed Renderer
stringcolorBrewerSchemesName="ArcGIS Colors";StyleProjectItemstyle= Project.Current.GetItems<StyleProjectItem>().First(s => s.Name ==colorBrewerSchemesName);stringcolorRampName="Heat Map 4 - Semitransparent";IList<ColorRampStyleItem>colorRampList=await QueuedTask.Run(()=>{return style.SearchColorRamps(colorRampName);});ColorRampStyleItemcolorRamp= colorRampList[0];await QueuedTask.Run(()=>{CIMPointSymbolpointSym= SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.GreenRGB,16.0, SimpleMarkerStyle.Diamond);CIMSymbolReferencesymbolPointTemplate= pointSym.MakeSymbolReference();//defining an unclassed renderer with custom upper and lower stops//all features with value >= 5,000,000 will be drawn with the upper color from the color ramp//all features with value <= 50,000 will be drawn with the lower color from the color rampUnclassedColorsRendererDefinitionunclassRndrDef=new UnclassedColorsRendererDefinition("Population", symbolPointTemplate, colorRamp.ColorRamp,"Highest","Lowest",5000000,50000){//drawing features with null values with a different symbolShowNullValues=true,NullValueLabel="Unknown"};CIMPointSymbolnullSym= SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.RedRGB,16.0, SimpleMarkerStyle.Circle); unclassRndrDef.NullValueSymbol = nullSym.MakeSymbolReference();FeatureLayerflyr= MapView.Active.Map.Layers[0]as FeatureLayer;CIMClassBreaksRenderercbRndr= flyr.CreateRenderer(unclassRndrDef)as CIMClassBreaksRenderer; flyr.SetRenderer(cbRndr);});
Create a Proportion Renderer with max and min symbol size capped
stringcolorBrewerSchemesName="ArcGIS Colors";StyleProjectItemstyle= Project.Current.GetItems<StyleProjectItem>().First(s => s.Name ==colorBrewerSchemesName);stringcolorRampName="Heat Map 4 - Semitransparent";IList<ColorRampStyleItem>colorRampList=await QueuedTask.Run(()=>{return style.SearchColorRamps(colorRampName);});ColorRampStyleItemcolorRamp= colorRampList[0];await QueuedTask.Run(()=>{CIMPointSymbolpointSym= SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.GreenRGB,1.0, SimpleMarkerStyle.Circle);CIMSymbolReferencesymbolPointTemplate= pointSym.MakeSymbolReference();//minimum symbol size is capped to 4 point while the maximum symbol size is set to 50 pointProportionalRendererDefinitionprDef=new ProportionalRendererDefinition("POPULATION", symbolPointTemplate,4,50,true){//setting upper and lower size stops to stop symbols growing or shrinking beyond those thresholdsUpperSizeStop=5000000,//features with values >= 5,000,000 will be drawn with maximum symbol sizeLowerSizeStop=50000//features with values <= 50,000 will be drawn with minimum symbol size};FeatureLayerflyr= MapView.Active.Map.Layers[0]as FeatureLayer;CIMProportionalRendererpropRndr= flyr.CreateRenderer(prDef)as CIMProportionalRenderer; flyr.SetRenderer(propRndr);});
Create a True Proportion Renderer
stringcolorBrewerSchemesName="ArcGIS Colors";StyleProjectItemstyle= Project.Current.GetItems<StyleProjectItem>().First(s => s.Name ==colorBrewerSchemesName);stringcolorRampName="Heat Map 4 - Semitransparent";IList<ColorRampStyleItem>colorRampList=await QueuedTask.Run(()=>{return style.SearchColorRamps(colorRampName);});ColorRampStyleItemcolorRamp= colorRampList[0];await QueuedTask.Run(()=>{CIMPointSymbolpointSym= SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.GreenRGB,1.0, SimpleMarkerStyle.Circle);CIMSymbolReferencesymbolPointTemplate= pointSym.MakeSymbolReference();//Defining proportional renderer where size of symbol will be same as its value in field used in the renderer.ProportionalRendererDefinitionprDef=new ProportionalRendererDefinition("POPULATION", esriUnits.esriMeters, symbolPointTemplate, SymbolShapes.Square, ValueRepresentations.Radius);FeatureLayerflyr= MapView.Active.Map.Layers[0]as FeatureLayer;CIMProportionalRendererpropRndr= flyr.CreateRenderer(prDef)as CIMProportionalRenderer; flyr.SetRenderer(propRndr);});
Elevation Surface Layers
Create a scene with a ground surface layer
// wrap in QueuedTask.Runvarscene= MapFactory.Instance.CreateScene("My scene", groundSourceUri, MapViewingMode.SceneGlobal);
Create a New Elevation Surface
//Note: call within QueuedTask.Run()//Define a ServiceConnection to use for the new Elevation surfacevarserverConnection=new CIMInternetServerConnection
{Anonymous=true,HideUserProperty=true,URL="https://elevation.arcgis.com/arcgis/services"};CIMAGSServiceConnectionserviceConnection=new CIMAGSServiceConnection
{ObjectName="WorldElevation/Terrain",ObjectType="ImageServer",URL="https://elevation.arcgis.com/arcgis/services/WorldElevation/Terrain/ImageServer",ServerConnection=serverConnection};//Defines a new elevation source set to the CIMAGSServiceConnection defined above//At 2.x - var newElevationSource = new ArcGIS.Core.CIM.CIMElevationSource//{// VerticalUnit = ArcGIS.Core.Geometry.LinearUnit.Meters,// DataConnection = serviceConnection,// Name = "WorldElevation/Terrain",// Visibility = true//};//The elevation surface//At 2.x - var newElevationSurface = new ArcGIS.Core.CIM.CIMMapElevationSurface//{// Name = "New Elevation Surface",// BaseSources = new ArcGIS.Core.CIM.CIMElevationSource[1] { newElevationSource },// Visibility = true,// ElevationMode = ElevationMode.CustomSurface,// VerticalExaggeration = 1,// EnableSurfaceShading = false,// SurfaceTINShadingMode = SurfaceTINShadingMode.Smooth,// Expanded = false,// MapElevationID = "{3DEC3CC5-7C69-4132-A700-DCD5BDED14D6}"//};//Get the active mapvarmap= MapView.Active.Map;//Get the elevation surfaces defined in the map//At 2.x - var listOfElevationSurfaces = definition.ElevationSurfaces.ToList();varlistOfElevationSurfaces= map.GetElevationSurfaceLayers();//Add the new elevation surface //At 2.x - listOfElevationSurfaces.Add(newElevationSurface);varelevationLyrCreationParams=new ElevationLayerCreationParams(serviceConnection);varelevationSurface= LayerFactory.Instance.CreateLayer<ElevationSurfaceLayer>(
elevationLyrCreationParams, map);
Set a custom elevation surface to a Z-Aware layer
//Define the custom elevation surface to use//At 2.x - var layerElevationSurface = new CIMLayerElevationSurface//{// MapElevationID = "{3DEC3CC5-7C69-4132-A700-DCD5BDED14D6}"//};varlayerElevationSurface=new CIMLayerElevationSurface
{ElevationSurfaceLayerURI="https://elevation3d.arcgis.com/arcgis/services/WorldElevation3D/Terrain3D/ImageServer"};//Get the layer's definitionvarlyrDefn= featureLayer.GetDefinition()as CIMBasicFeatureLayer;//Set the layer's elevation surface
lyrDefn.LayerElevation =layerElevationSurface;//Set the layer's definition
featureLayer.SetDefinition(lyrDefn);
Add an elevation source to an existing elevation surface layer
// wrap in QueuedTask.Run// surfaceLayer could also be the ground layerstringuri="https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer";varcreateParams=new ElevationLayerCreationParams(new Uri(uri));
createParams.Name ="Terrain 3D";vareleSourceLayer= LayerFactory.Instance.CreateLayer<Layer>(createParams, surfaceLayer);
Get the elevation surface layers and elevation source layers from a map
// retrieve the elevation surface layers in the map including the GroundvarsurfaceLayers= map.GetElevationSurfaceLayers();// retrieve the single ground elevation surface layer in the mapvargroundSurfaceLayer= map.GetGroundElevationSurfaceLayer();// determine the number of elevation sources in the ground elevation surface layerintnumberGroundSources= groundSurfaceLayer.Layers.Count;// get the first elevation source layer from the ground elevation surface layervargroundSourceLayer= groundSurfaceLayer.Layers.FirstOrDefault();
// wrap in a QueuedTask.Run
map.ClearElevationSurfaceLayers();//Ground will not be removed
map.RemoveLayer(surfaceLayer);//Cannot remove ground
map.RemoveLayers(map.GetElevationSurfaceLayers());//Ground will not be removed
Get Z values from the default ground surface
varmapPoint=await QueuedTask.Run<MapPoint>(()=>{MapPointmapCentergeometry= MapView.Active.Map.CalculateFullExtent().Center;returnmapCentergeometry;});//Pass any Geometry type to GetZsFromSurfaceAsyncvarsurfaceZResult=await MapView.Active.Map.GetZsFromSurfaceAsync(mapPoint);if(surfaceZResult.Status == SurfaceZsResultStatus.Ok){// cast to a mapPointvarmapPointZ= surfaceZResult.Geometry as MapPoint;varz= mapPointZ.Z;}
Get Z values from a specific surface
vareleLayer= MapView.Active.Map.GetElevationSurfaceLayers().FirstOrDefault(l => l.Name =="TIN");//Pass any Geometry type to GetZsFromSurfaceAsyncvarzResult=await MapView.Active.Map.GetZsFromSurfaceAsync(polyline, eleLayer);if(zResult.Status == SurfaceZsResultStatus.Ok){varpolylineZ= zResult.Geometry as Polyline;// process the polylineZ}
Get Z values from a layer
vartinLayer= MapView.Active.Map.GetLayersAsFlattenedList().OfType<TinLayer>().FirstOrDefault();await QueuedTask.Run(()=>{if(tinLayer.CanGetZs()){// get z value for a mapPointvarzResult= tinLayer.GetZs(mapPoint);if(zResult.Status == SurfaceZsResultStatus.Ok){// cast to a mapPointvarmapPointZ= surfaceZResult.Geometry as MapPoint;varz= mapPointZ.Z;}// get z values for a polylinezResult= tinLayer.GetZs(polyline);if(zResult.Status == SurfaceZsResultStatus.Ok){// cast to a mapPointvarpolylineZ= surfaceZResult.Geometry as Polyline;}}});
Get Elevation profile from the default ground surface
// find the elevation profile for a polyline / set of polylinesvarresult=await MapView.Active.Map.GetElevationProfileFromSurfaceAsync([lineGeom]);if(result.Status == SurfaceZsResultStatus.Ok){varpolylineZ= result.Polyline;// process the polylineZ}// find the elevation profile for a set of pointsresult=await MapView.Active.Map.GetElevationProfileFromSurfaceAsync(pts);if(result.Status == SurfaceZsResultStatus.Ok){varpolylineZ= result.Polyline;// process the polylineZ}
Get Elevation profile from a specific surface
// find the elevation profile for a polyline / set of polylinesvareleLayer= MapView.Active.Map.GetElevationSurfaceLayers().FirstOrDefault(l => l.Name =="TIN");varzResult=await MapView.Active.Map.GetElevationProfileFromSurfaceAsync([lineGeom], eleLayer);if(zResult.Status == SurfaceZsResultStatus.Ok){varpolylineZ= zResult.Polyline;// process the polylineZ}// find the elevation profile for a set of pointszResult=await MapView.Active.Map.GetElevationProfileFromSurfaceAsync(pts, eleLayer);if(zResult.Status == SurfaceZsResultStatus.Ok){varpolylineZ= zResult.Polyline;// process the polylineZ}
Interpolate a line between two points and calculate the elevation profile
intnumPoints=20;// use the default ground elevation surfacevarresult=await MapView.Active.Map.GetElevationProfileFromSurfaceAsync(startPt, endPt, numPoints);if(result.Status == SurfaceZsResultStatus.Ok){varpolylineZ= result.Polyline;// process the polylineZ}// use a specific elevation surfacevareleLayer= MapView.Active.Map.GetElevationSurfaceLayers().FirstOrDefault(l => l.Name =="TIN");result=await MapView.Active.Map.GetElevationProfileFromSurfaceAsync(startPt, endPt, numPoints, eleLayer);if(result.Status == SurfaceZsResultStatus.Ok){varpolylineZ= result.Polyline;// process the polylineZ}
Raster Layers
Create a raster layer
stringurl=@"C:\Images\Italy.tif";await QueuedTask.Run(()=>{// Create a raster layer using a path to an image.// Note: You can create a raster layer from a url, project item, or data connection.rasterLayer= LayerFactory.Instance.CreateLayer(new Uri(url), aMap)as RasterLayer;});
Update the raster colorizer on a raster layer
await QueuedTask.Run(()=>{// Get the colorizer from the raster layer.CIMRasterColorizerrasterColorizer= rasterLayer.GetColorizer();// Update raster colorizer properties. rasterColorizer.Brightness =10; rasterColorizer.Contrast =-5; rasterColorizer.ResamplingType = RasterResamplingType.NearestNeighbor;// Update the raster layer with the changed colorizer. rasterLayer.SetColorizer(rasterColorizer);});
Update the RGB colorizer on a raster layer
await QueuedTask.Run(()=>{// Get the colorizer from the raster layer.CIMRasterColorizerrColorizer= rasterLayer.GetColorizer();// Check if the colorizer is an RGB colorizer.if(rColorizer is CIMRasterRGBColorizer rasterRGBColorizer){// Update RGB colorizer properties. rasterRGBColorizer.StretchType = RasterStretchType.ESRI;// Update the raster layer with the changed colorizer. rasterLayer.SetColorizer(rasterRGBColorizer);}});
Check if a certain colorizer can be applied to a raster layer
await QueuedTask.Run(()=>{// Get the list of colorizers that can be applied to the raster layer.IEnumerable<RasterColorizerType>applicableColorizerList= rasterLayer.GetApplicableColorizers();// Check if the RGB colorizer is part of the list.boolisTrue_ContainTheColorizerType= applicableColorizerList.Contains(RasterColorizerType.RGBColorizer);});
Create a new colorizer based on a default colorizer definition and apply it to the raster layer
await QueuedTask.Run(async()=>{// Check if the Stretch colorizer can be applied to the raster layer.if(rasterLayer.GetApplicableColorizers().Contains(RasterColorizerType.StretchColorizer)){// Create a new Stretch Colorizer Definition using the default constructor.StretchColorizerDefinitionstretchColorizerDef_default=new StretchColorizerDefinition();// Create a new Stretch colorizer using the colorizer definition created above.CIMRasterStretchColorizernewStretchColorizer_default=await rasterLayer.CreateColorizerAsync(stretchColorizerDef_default)as CIMRasterStretchColorizer;// Set the new colorizer on the raster layer. rasterLayer.SetColorizer(newStretchColorizer_default);}});
Create a new colorizer based on a custom colorizer definition and apply it to the raster layer
await QueuedTask.Run(async()=>{// Check if the Stretch colorizer can be applied to the raster layer.if(rasterLayer.GetApplicableColorizers().Contains(RasterColorizerType.StretchColorizer)){// Create a new Stretch Colorizer Definition specifying parameters // for band index, stretch type, gamma and color ramp.StretchColorizerDefinitionstretchColorizerDef_custom=new StretchColorizerDefinition(1, RasterStretchType.ESRI,2, colorRamp);// Create a new stretch colorizer using the colorizer definition created above.CIMRasterStretchColorizernewStretchColorizer_custom=await rasterLayer.CreateColorizerAsync(stretchColorizerDef_custom)as CIMRasterStretchColorizer;// Set the new colorizer on the raster layer. rasterLayer.SetColorizer(newStretchColorizer_custom);}});
Create a raster layer with a new colorizer definition
// Create a new stretch colorizer definition using default constructor.StretchColorizerDefinitionstretchColorizerDef=new StretchColorizerDefinition();varrasterLayerCreationParams=new RasterLayerCreationParams(new Uri(url)){ColorizerDefinition=stretchColorizerDef,Name=layerName,MapMemberIndex=0};await QueuedTask.Run(()=>{// Create a raster layer using the colorizer definition created above.// Note: You can create a raster layer from a url, project item, or data connection.RasterLayerrasterLayerfromURL= LayerFactory.Instance.CreateLayer<RasterLayer>(rasterLayerCreationParams, aMap);});
Mosaic Layers
Create a mosaic layer
MosaicLayermosaicLayer=null;stringurl=@"C:\Images\countries.gdb\Italy";await QueuedTask.Run(()=>{// Create a mosaic layer using a path to a mosaic dataset.// Note: You can create a mosaic layer from a url, project item, or data connection.mosaicLayer= LayerFactory.Instance.CreateLayer(new Uri(url), aMap)as MosaicLayer;});
Update the raster colorizer on a mosaic layer
await QueuedTask.Run(()=>{// Get the image sub-layer from the mosaic layer.ImageMosaicSubLayermosaicImageSubLayer= mosaicLayer.GetImageLayer();// Get the colorizer from the image sub-layer.CIMRasterColorizerrasterColorizer= mosaicImageSubLayer.GetColorizer();// Update raster colorizer properties. rasterColorizer.Brightness =10; rasterColorizer.Contrast =-5; rasterColorizer.ResamplingType = RasterResamplingType.NearestNeighbor;// Update the image sub-layer with the changed colorizer. mosaicImageSubLayer.SetColorizer(rasterColorizer);});
Update the RGB colorizer on a mosaic layer
await QueuedTask.Run(()=>{// Get the image sub-layer from the mosaic layer.ImageMosaicSubLayermosaicImageSubLayer= mosaicLayer.GetImageLayer();// Get the colorizer from the image sub-layer.CIMRasterColorizerrColorizer= mosaicImageSubLayer.GetColorizer();// Check if the colorizer is an RGB colorizer.if(rColorizer is CIMRasterRGBColorizer rasterRGBColorizer){// Update RGB colorizer properties. rasterRGBColorizer.StretchType = RasterStretchType.ESRI;// Update the image sub-layer with the changed colorizer. mosaicImageSubLayer.SetColorizer(rasterRGBColorizer);}});
Check if a certain colorizer can be applied to a mosaic layer
await QueuedTask.Run(()=>{// Get the image sub-layer from the mosaic layer.ImageMosaicSubLayermosaicImageSubLayer= mosaicLayer.GetImageLayer();// Get the list of colorizers that can be applied to the image sub-layer.IEnumerable<RasterColorizerType>applicableColorizerList= mosaicImageSubLayer.GetApplicableColorizers();// Check if the RGB colorizer is part of the list.boolisTrue_ContainTheColorizerType= applicableColorizerList.Contains(RasterColorizerType.RGBColorizer);});
Create a new colorizer based on a default colorizer definition and apply it to the mosaic layer
await QueuedTask.Run(async()=>{// Get the image sub-layer from the mosaic layer.ImageMosaicSubLayermosaicImageSubLayer= mosaicLayer.GetImageLayer();// Check if the Stretch colorizer can be applied to the image sub-layer.if(mosaicImageSubLayer.GetApplicableColorizers().Contains(RasterColorizerType.StretchColorizer)){// Create a new Stretch Colorizer Definition using the default constructor.StretchColorizerDefinitionstretchColorizerDef_default=new StretchColorizerDefinition();// Create a new Stretch colorizer using the colorizer definition created above.CIMRasterStretchColorizernewStretchColorizer_default=await mosaicImageSubLayer.CreateColorizerAsync(stretchColorizerDef_default)as CIMRasterStretchColorizer;// Set the new colorizer on the image sub-layer. mosaicImageSubLayer.SetColorizer(newStretchColorizer_default);}});
Create a new colorizer based on a custom colorizer definition and apply it to the mosaic layer
await QueuedTask.Run(async()=>{// Get the image sub-layer from the mosaic layer.ImageMosaicSubLayermosaicImageSubLayer= mosaicLayer.GetImageLayer();// Check if the Stretch colorizer can be applied to the image sub-layer.if(mosaicImageSubLayer.GetApplicableColorizers().Contains(RasterColorizerType.StretchColorizer)){// Create a new Stretch colorizer definition specifying parameters// for band index, stretch type, gamma and color ramp.StretchColorizerDefinitionstretchColorizerDef_custom=new StretchColorizerDefinition(1, RasterStretchType.ESRI,2, colorRamp);// Create a new stretch colorizer using the colorizer definition created above.CIMRasterStretchColorizernewStretchColorizer_custom=await mosaicImageSubLayer.CreateColorizerAsync(stretchColorizerDef_custom)as CIMRasterStretchColorizer;// Set the new colorizer on the image sub-layer. mosaicImageSubLayer.SetColorizer(newStretchColorizer_custom);}});
Create a mosaic layer with a new colorizer definition
// Create a new colorizer definition using default constructor.StretchColorizerDefinitionstretchColorizerDef=new StretchColorizerDefinition();varrasterLayerCreationParams=new RasterLayerCreationParams(new Uri(url)){Name=layerName,ColorizerDefinition=stretchColorizerDef,MapMemberIndex=0};await QueuedTask.Run(()=>{// Create a mosaic layer using the colorizer definition created above.// Note: You can create a mosaic layer from a url, project item, or data connection.MosaicLayernewMosaicLayer= LayerFactory.Instance.CreateLayer<MosaicLayer>(rasterLayerCreationParams, aMap);});
Update the sort order - mosaic method on a mosaic layer
await QueuedTask.Run(()=>{// Get the image sub-layer from the mosaic layer.ImageServiceLayermosaicImageSubLayer= mosaicLayer.GetImageLayer()as ImageServiceLayer;// Get the mosaic rule.CIMMosaicRulemosaicingRule= mosaicImageSubLayer.GetMosaicRule();// Set the Mosaic Method to Center. mosaicingRule.MosaicMethod = RasterMosaicMethod.Center;// Update the mosaic with the changed mosaic rule. mosaicImageSubLayer.SetMosaicRule(mosaicingRule);});
Update the resolve overlap - mosaic operator on a mosaic layer
await QueuedTask.Run(()=>{// Get the image sub-layer from the mosaic layer.ImageServiceLayermosaicImageSublayer= mosaicLayer.GetImageLayer()as ImageServiceLayer;// Get the mosaic rule.CIMMosaicRulemosaicRule= mosaicImageSublayer.GetMosaicRule();// Set the Mosaic Operator to Mean. mosaicRule.MosaicOperatorType = RasterMosaicOperatorType.Mean;// Update the mosaic with the changed mosaic rule. mosaicImageSublayer.SetMosaicRule(mosaicRule);});
Image Service Layers
Create an image service layer
ImageServiceLayerisLayer=null;stringurl=@"http://imagery.arcgisonline.com/arcgis/services/LandsatGLS/GLS2010_Enhanced/ImageServer";await QueuedTask.Run(()=>{// Create an image service layer using the url for an image service.isLayer= LayerFactory.Instance.CreateLayer(new Uri(url), aMap)as ImageServiceLayer;});
Update the raster colorizer on an image service layer
await QueuedTask.Run(()=>{// Get the colorizer from the image service layer.CIMRasterColorizerrasterColorizer= isLayer.GetColorizer();// Update the colorizer properties. rasterColorizer.Brightness =10; rasterColorizer.Contrast =-5; rasterColorizer.ResamplingType = RasterResamplingType.NearestNeighbor;// Update the image service layer with the changed colorizer. isLayer.SetColorizer(rasterColorizer);});
Update the RGB colorizer on an image service layer
await QueuedTask.Run(()=>{// Get the colorizer from the image service layer.CIMRasterColorizerrColorizer= isLayer.GetColorizer();// Check if the colorizer is an RGB colorizer.if(rColorizer is CIMRasterRGBColorizer rasterRGBColorizer){// Update RGB colorizer properties. rasterRGBColorizer.StretchType = RasterStretchType.ESRI;// Update the image service layer with the changed colorizer. isLayer.SetColorizer((CIMRasterColorizer)rasterRGBColorizer);}});
Check if a certain colorizer can be applied to an image service layer
await QueuedTask.Run(()=>{// Get the list of colorizers that can be applied to the imager service layer.IEnumerable<RasterColorizerType>applicableColorizerList= isLayer.GetApplicableColorizers();// Check if the RGB colorizer is part of the list.boolisTrue_ContainTheColorizerType= applicableColorizerList.Contains(RasterColorizerType.RGBColorizer);});
Create a new colorizer based on a default colorizer definition and apply it to the image service layer
await QueuedTask.Run(async()=>{// Check if the Stretch colorizer can be applied to the image service layer.if(isLayer.GetApplicableColorizers().Contains(RasterColorizerType.StretchColorizer)){// Create a new Stretch Colorizer Definition using the default constructor.StretchColorizerDefinitionstretchColorizerDef_default=new StretchColorizerDefinition();// Create a new Stretch colorizer using the colorizer definition created above.CIMRasterStretchColorizernewStretchColorizer_default=await isLayer.CreateColorizerAsync(stretchColorizerDef_default)as CIMRasterStretchColorizer;// Set the new colorizer on the image service layer. isLayer.SetColorizer(newStretchColorizer_default);}});
Create a new colorizer based on a custom colorizer definition and apply it to the image service layer
await QueuedTask.Run(async()=>{// Check if the Stretch colorizer can be applied to the image service layer.if(isLayer.GetApplicableColorizers().Contains(RasterColorizerType.StretchColorizer)){// Create a new Stretch Colorizer Definition specifying parameters// for band index, stretch type, gamma and color ramp. StretchColorizerDefinitionstretchColorizerDef_custom=new StretchColorizerDefinition(1, RasterStretchType.ESRI,2, colorRamp);// Create a new stretch colorizer using the colorizer definition created above.CIMRasterStretchColorizernewStretchColorizer_custom=await isLayer.CreateColorizerAsync(stretchColorizerDef_custom)as CIMRasterStretchColorizer;// Set the new colorizer on the image service layer. isLayer.SetColorizer(newStretchColorizer_custom);}});
Create an image service layer with a new colorizer definition
// Create a new colorizer definition using default constructor.StretchColorizerDefinitionstretchColorizerDef=new StretchColorizerDefinition();varrasterLayerCreationParams=new RasterLayerCreationParams(new Uri(url)){Name=layerName,ColorizerDefinition=stretchColorizerDef,MapMemberIndex=0};await QueuedTask.Run(()=>{// Create an image service layer using the colorizer definition created above.ImageServiceLayerimageServiceLayer= LayerFactory.Instance.CreateLayer<ImageServiceLayer>(rasterLayerCreationParams, aMap);});
Update the sort order - mosaic method on an image service layer
await QueuedTask.Run(()=>{// Get the mosaic rule of the image service.CIMMosaicRulemosaicRule= isLayer.GetMosaicRule();// Set the Mosaic Method to Center. mosaicRule.MosaicMethod = RasterMosaicMethod.Center;// Update the image service with the changed mosaic rule. isLayer.SetMosaicRule(mosaicRule);});
Update the resolve overlap - mosaic operator on an image service layer
await QueuedTask.Run(()=>{// Get the mosaic rule of the image service.CIMMosaicRulemosaicingRule= isLayer.GetMosaicRule();// Set the Mosaic Operator to Mean. mosaicingRule.MosaicOperatorType = RasterMosaicOperatorType.Mean;// Update the image service with the changed mosaic rule. isLayer.SetMosaicRule(mosaicingRule);});
Working with Standalone Tables
Create a StandaloneTable
//container can be a map or group layervarcontainer= MapView.Active.Map;//var container = MapView.Active.Map.GetLayersAsFlattenedList()// .OfType<GroupLayer>().First();
QueuedTask.Run(()=>{//use a local pathvartable= StandaloneTableFactory.Instance.CreateStandaloneTable(new Uri(@"C:\Temp\Data\SDK.gdb\EarthquakeDamage", UriKind.Absolute),container);//use a URI to a feature service table endpointvartable2= StandaloneTableFactory.Instance.CreateStandaloneTable(new Uri(@"https://bexdog.esri.com/server/rest/services/FeatureServer"+"/2", UriKind.Absolute), container);//Use an itemvaritem= ItemFactory.Instance.Create(@"C:\Temp\Data\SDK.gdb\ParcelOwners");vartableCreationParams=new StandaloneTableCreationParams(item);vartable3= StandaloneTableFactory.Instance.CreateStandaloneTable(tableCreationParams, container);//use table creation paramsvartable_params=new StandaloneTableCreationParams(item){// At 2.x - DefinitionFilter = new CIMDefinitionFilter()//{// //optional - use a filter// DefinitionExpression = "LAND_USE = 3"//}DefinitionQuery=new DefinitionQuery(whereClause:"LAND_USE = 3", name:"Landuse")};vartable4= StandaloneTableFactory.Instance.CreateStandaloneTable(table_params, container);});
Retrieve a table from its container
varcontainer= MapView.Active.Map;//the map standalone table collectionvartable= container.GetStandaloneTablesAsFlattenedList().FirstOrDefault(tbl => tbl.Name =="EarthquakeDamage");//or from a group layervargrp_layer= MapView.Active.Map.FindLayers("GroupLayer1").First()as GroupLayer;vartable2= grp_layer.FindStandaloneTables("EarthquakeDamage").First();//or grp_layer.GetStandaloneTablesAsFlattenedList().First()//or grp_layer.StandaloneTables.Where(...).First(), etc.//show the table in a table view //use FrameworkApplication.Current.Dispatcher.BeginInvoke if not on the UI thread
FrameworkApplication.Panes.OpenTablePane(table2);
Move a Standalone table
//get the first group layer that has at least one tablevargrp_layer= MapView.Active.Map.GetLayersAsFlattenedList().OfType<GroupLayer>().First(g => g.StandaloneTables.Count >0);varmap= MapView.Active.Map;//assumes non-null
QueuedTask.Run(()=>{//move the first table to the bottom of the container grp_layer.MoveStandaloneTable(grp_layer.StandaloneTables.First(),-1);//move the last table in the map standalone tables to a group//layer and place it at position 3. If 3 is invalid, the table//will be placed at the bottom of the target container//assumes the map has at least one standalone table...vartable= map.StandaloneTables.Last(); map.MoveStandaloneTable(table, grp_layer,3);//move a table from a group layer to the map standalone tables//collection - assumes a table called 'Earthquakes' existsvartable2= grp_layer.FindStandaloneTables("Earthquakes").First();//move to the map container map.MoveStandaloneTable(table2,0);//will be placed at the top});
Remove a Standalone table
//get the first group layer that has at least one tablevargrp_layer= MapView.Active.Map.GetLayersAsFlattenedList().OfType<GroupLayer>().First(g => g.StandaloneTables.Count >0);varmap= MapView.Active.Map;//assumes non-null
QueuedTask.Run(()=>{//get the tables from the map containervartables= map.GetStandaloneTablesAsFlattenedList();//delete the first...if(tables.Count()>0){ map.RemoveStandaloneTable(tables.First());//or delete all of them map.RemoveStandaloneTables(tables);}//delete a table from a group layer//assumes it has at least one table... grp_layer.RemoveStandaloneTable(grp_layer.StandaloneTables.First());});
SelectionSet
Translate From Dictionary to SelectionSet
//Create a selection set from a list of object ids//using FromDictionaryvaraddToSelection=newDictionary<MapMember,List<long>>();
addToSelection.Add(us_zips_layer,newList<long>{1506,2696,2246,1647,948});varselSet= ArcGIS.Desktop.Mapping.SelectionSet.FromDictionary(addToSelection);
Tranlate from SelectionSet to Dictionary
varselSetDict= selSet.ToDictionary();// convert to the dictionary and only include those that are of type FeatureLayervarselSetDictFeatureLayer= selSet.ToDictionary<FeatureLayer>();
Get OIDS from a SelectionSet for a given MapMember
varoptions= ApplicationOptions.SelectionOptions;
QueuedTask.Run(()=>{vardefaultColor= options.DefaultSelectionColor;varcolor= options.SelectionColor as CIMRGBColor; options.SetSelectionColor(ColorFactory.Instance.CreateRGBColor(255,0,0));vardefaultFill= options.DefaultSelectionFillColor;varfill= options.SelectionFillColor;varisHatched= options.IsSelectionFillHatched; options.SetSelectionFillColor(ColorFactory.Instance.CreateRGBColor(100,100,0));if(!isHatched) options.SetSelectionFillIsHatched(true);varshowSelectionChip= options.ShowSelectionChip; options.SetShowSelectionChip(!showSelectionChip);varshowSelectionGraphic= options.ShowSelectionGraphic; options.SetShowSelectionGraphic(!showSelectionGraphic);varsaveSelection= options.SaveSelection; options.SetSaveSelection(!saveSelection);vardefaultTol= options.DefaultSelectionTolerance;vartol= options.SelectionTolerance; options.SetSelectionTolerance(2*defaultTol);// extension methods available varselMethod= options.SelectionMethod; options.SetSelectionMethod(SelectionMethod.Contains);varcombMethod= options.CombinationMethod; options.SetCombinationMethod(SelectionCombinationMethod.Add);// note that the following SelectionCombinationMethod is not supported//options.SetCombinationMethod(SelectionCombinationMethod.XOR);});
Symbol Layer Drawing (SLD)
Add SLD
QueuedTask.Run(()=>{//check if it can be added to the layerif(featLayer.CanAddSymbolLayerDrawing()) featLayer.AddSymbolLayerDrawing();//ditto for a group layer...must have at least//one child feature layer that can participateif(groupLayer.CanAddSymbolLayerDrawing()) groupLayer.AddSymbolLayerDrawing();});
Determine if a layer has SLD added
//SLD can be added to feature layers and group layers//For a group layer, SLD controls all child feature layers//that are participating in the SLD//var featLayer = ...;//retrieve the feature layer//var groupLayer = ...;//retrieve the group layer
QueuedTask.Run(()=>{//Check if the layer has SLD added -returns a tuplevartuple= featLayer.HasSymbolLayerDrawingAdded();if(tuple.addedOnLayer){//SLD is added on the layer}elseif(tuple.addedOnParent){//SLD is added on the parent (group layer) - //check parent...this can be recursivevarparentLayer= GetParentLayerWithSLD(featLayer.Parent as GroupLayer);/* * //Recursively get the parent with SLD public GroupLayer GetParentLayerWithSLD(GroupLayer groupLayer) { if (groupLayer == null) return null; //Must be on QueuedTask var sld_added = groupLayer.HasSymbolLayerDrawingAdded(); if (sld_added.addedOnLayer) return groupLayer; else if (sld_added.addedOnParent) return GetParentLayerWithSLD(groupLayer.Parent as GroupLayer); return null; } */}});
Enable/Disable SLD
QueuedTask.Run(()=>{//A layer may have SLD added but is not using it//HasSymbolLayerDrawingAdded returns a tuple - to check//the layer has SLD (not its parent) check addedOnLayerif(featLayer.HasSymbolLayerDrawingAdded().addedOnLayer){//the layer has SLD but is the layer currently using it?//GetUseSymbolLayerDrawing returns a tuple - useOnLayer for //the layer (and useOnParent for the parent layer)if(!featLayer.GetUseSymbolLayerDrawing().useOnLayer){//enable it featLayer.SetUseSymbolLayerDrawing(true);}}//Enable/Disable SLD on a layer parentif(featLayer.HasSymbolLayerDrawingAdded().addedOnParent){//check parent...this can be recursivevarparent= GetParentLayerWithSLD(featLayer.Parent as GroupLayer);if(parent.GetUseSymbolLayerDrawing().useOnLayer) parent.SetUseSymbolLayerDrawing(true);}/* * //Recursively get the parent with SLD public GroupLayer GetParentLayerWithSLD(GroupLayer groupLayer) { if (groupLayer == null) return null; //Must be on QueuedTask var sld_added = groupLayer.HasSymbolLayerDrawingAdded(); if (sld_added.addedOnLayer) return groupLayer; else if (sld_added.addedOnParent) return GetParentLayerWithSLD(groupLayer.Parent as GroupLayer); return null; } */});
Device Location API, GPS/GNSS Devices
Connect to a Device Location Source
varnewSrc=new SerialPortDeviceLocationSource();//Specify the COM port the device is connected to
newSrc.ComPort ="Com3";
newSrc.BaudRate =4800;
newSrc.AntennaHeight =3;// meters//fill in other properties as neededvarprops=new DeviceLocationProperties();
props.AccuracyThreshold =10;// meters// jump to the background threadawait QueuedTask.Run(()=>{//open the device DeviceLocationService.Instance.Open(newSrc, props);});
Get the Current Device Location Source
varsource= DeviceLocationService.Instance.GetSource();if(source==null){//There is no current source}
Close the Current Device Location Source
//Is there a current device source?varsrc= DeviceLocationService.Instance.GetSource();if(src==null)return;//no current sourceawait QueuedTask.Run(()=>{ DeviceLocationService.Instance.Close();});
Update Properties on the Current Device Location Source
await QueuedTask.Run(()=>{vardlProps= DeviceLocationService.Instance.GetProperties();//Change the accuracy threshold dlProps.AccuracyThreshold =22.5;// meters DeviceLocationService.Instance.UpdateProperties(dlProps);});
Subscribe to DeviceLocationPropertiesUpdated event
privatevoidSubscribeToPropertiesEvents(){
DeviceLocationPropertiesUpdatedEvent.Subscribe(OnDeviceLocationPropertiesUpdated);}privatevoidOnDeviceLocationPropertiesUpdated(DeviceLocationPropertiesUpdatedEventArgsargs){if(args==null)return;varproperties= args.DeviceLocationProperties;// TODO - something with the updated properties}
Subscribe to DeviceLocationSourceChanged event
privatevoidSubscribeToSourceEvents(){
DeviceLocationSourceChangedEvent.Subscribe(OnDeviceLocationSourceChanged);}privatevoidOnDeviceLocationSourceChanged(DeviceLocationSourceChangedEventArgsargs){if(args==null)return;varsource= args.DeviceLocationSource;// TODO - something with the updated source properties}
Map Device Location Options
Enable/Disable Current Device Location Source For the Map
Check if The Current Device Location Is Enabled On The Map
if(MapDeviceLocationService.Instance.IsDeviceLocationEnabled){//The Device Location Source is Enabled}
Set Current Map Device Location Options
//Must be on the QueuedTask.Run()//Check there is a source first...if(DeviceLocationService.Instance.GetSource()==null)//Setting DeviceLocationOptions w/ no Device Location Source//Will throw an InvalidOperationExceptionreturn;varmap= MapView.Active.Map;if(!MapDeviceLocationService.Instance.IsDeviceLocationEnabled)//Setting DeviceLocationOptions w/ no Device Location Enabled//Will throw an InvalidOperationExceptionreturn;
MapDeviceLocationService.Instance.SetDeviceLocationOptions(new MapDeviceLocationOptions(){DeviceLocationVisibility=true,NavigationMode= MappingDeviceLocationNavigationMode.KeepAtCenter,TrackUpNavigation=true});
Zoom/Pan The Map To The Most Recent Location
//Must be on the QueuedTask.Run()if(!MapDeviceLocationService.Instance.IsDeviceLocationEnabled)//Calling ZoomOrPanToCurrentLocation w/ no Device Location Enabled//Will throw an InvalidOperationExceptionreturn;// true for zoom, false for pan
MapDeviceLocationService.Instance.ZoomOrPanToCurrentLocation(true);
Add the Most Recent Location To A Graphics Layer
//var graphicsLayer = ... ;//Must be on the QueuedTask.Run()// get the last locationvarpt= DeviceLocationService.Instance.GetCurrentSnapshot()?.GetPositionAsMapPoint();if(pt!=null){//Create a point symbolvarptSymbol= SymbolFactory.Instance.ConstructPointSymbol(
CIMColor.CreateRGBColor(125,125,0),10, SimpleMarkerStyle.Triangle);//Add a graphic to the graphics layer
graphicsLayer.AddElement(pt, ptSymbol);//unselect it
graphicsLayer.ClearSelection();}
Set map view to always be centered on the device location
privatevoidSubscribeToSnapshotEvents(){
SnapshotChangedEvent.Subscribe(OnSnapshotChanged);}privatevoidOnSnapshotChanged(SnapshotChangedEventArgsargs){if(args==null)return;varsnapshot= args.Snapshot as NMEASnapshot;if(snapshot==null)return;
QueuedTask.Run(()=>{varpt= snapshot.GetPositionAsMapPoint();if(pt?.IsEmpty ??true)return;// access propertiesvaralt= snapshot.Altitude;vardt= snapshot.DateTime;varvdop= snapshot.VDOP;varhdop= snapshot.HDOP;// etc//TODO: use the snapshot});}
Feature Masking
Get the Mask Geometry for a Feature
varfeatureLayer= MapView.Active.Map.GetLayersAsFlattenedList().OfType<BasicFeatureLayer>().FirstOrDefault();if(featureLayer==null)return;varmv= MapView.Active;
QueuedTask.Run(()=>{using(vartable= featureLayer.GetTable()){using(varrc= table.Search()){//get the first feature...//...assuming at least one feature gets retrieved rc.MoveNext();varoid= rc.Current.GetObjectID();//Use DrawingOutlineType.BoundingEnvelope to retrieve a generalized//mask geometry or "Box". The mask will be in the same SpatRef as the map//At 2.x - var mask_geom = featureLayer.QueryDrawingOutline(oid, mv, DrawingOutlineType.Exact);varmask_geom= featureLayer.GetDrawingOutline(oid, mv, DrawingOutlineType.Exact);//TODO - use the mask geometry...}}});