ArcGIS Pro中的映射功能通过ArcGIS.Desktop.Mapping程序集提供。地图探索提供了支持导航和与地图视图交互的类和成员。这包括通过缩放到图层、特征和书签来修改视图的范围,以及交互式地选择或返回与给定草图几何图元相交的特征。

  • ArcGIS.Desktop.Mapping.dll
  • ArcGIS.Desktop.Extensions.dll

MapView

一个项目可以包含多个二维或三维地图,每个地图都定义了组成该地图的图层集合。地图视图只是地图的视图。地图视图是用于在二维或三维地图中显示、导航、选择、标识和编辑数据的主要界面。MapView类提供属性和方法来导航和与地图中的图层交互。可以通过Map属性访问视图中可视化的地图。
一次可以打开多个地图视图,但只能有一个活动地图视图。活动地图视图将为应用程序中的功能区和许多停靠窗格设置上下文。例如,地图内容窗格将反映活动地图视图的地图的图层。可以通过MapView上的静态active属性访问活动地图视图的实例。如果没有活动的映射视图,活动属性将返回null。这在编写用于与活动映射交互的命令时非常有用。

可以通过SetSceneDrawingMode方法设置3D地图视图的绘制模式。场景绘制模式可以是透视或等轴测。默认绘图模式为透视,新的3D地图视图始终以透视模式打开。可以使用SetFieldOfView方法更改场景的视角。
地图视图还提供了目录窗格(也称为“TOC”)中所选项目的上下文。例如,GetSelectedLayers方法返回当前在“内容”窗格中选择的层的集合。此上下文用于确定要显示的上下文选项卡,例如,当选择一个或多个要素图层时,将显示要素图层选项卡组,并且命令将作用于选定的要素图层。这在编写命令以处理“内容”窗格中的选定项目时非常有用。

Navigation

地图视图的相机定义地图中显示的区域。可以通过地图视图上的“摄影机”属性访问摄影机。可以使用ZoomTo(摄影机)方法设置地图视图的摄影机。除了直接设置相机外,ZoomTo和PanTo还有几种重载方法,可用于缩放到层的范围、书签的定义、特定几何体等。

Select and identify

在某些情况下,您可能希望提供一个工具,允许用户在地图中交互单击并绘制草图,并选择或获取与草图相交的特征集合。MapTool抽象类提供了一种简单的方法来编写工具,该工具可以在地图视图中创建草图并从草图中返回几何体。然后,可以将此几何体传递到SelectFeatures或GetFeature方法中,以选择或返回与几何体相交的特征集合。

Camera

相机用作显示世界或地图的工具,可以在空间中移动以更改视图。相机在地图上以2D和3D方式描述您的活动视点。可以使用“摄影机”属性从视图中获取当前摄影机。您可以通过调用ZoomTo(相机)方法并传入所需的相机来设置相机。
虚拟相机是地图的窗口。与您可以在现实世界中操作的物理相机非常相似,ArcGIS Pro虚拟相机可以四处移动以查看地图(2D和3D)。相机的移动在地图或3D轴系统(X、Y和Z)的坐标中完成。

Viewing modes

相机对象上的二维和三维特性都可用。如果地图视图的ViewingMode为map,则可以设置二维属性。如果ViewingMode是SceneGlobal或SceneLocal,则可以设置3D属性。

2D相机

在2D中,相机使用X和Y定义其查看位置。这些值的单位与相机的空间参考定义的单位相同。这将是二维视图范围的中心点。地图的查看方向或旋转是使用相机的“标题”属性定义的。然后,摄影机的“缩放”属性定义视图的放大或缩小程度。该值以双精度表示,表示比率右侧的值。例如,值1000等于比例1:1000。

3D相机

在3D中,相机使用X、Y和Z定义其查看位置。与2D一样,值存储在与相机的空间参考定义的单位相同的单位中,XY单位和Z单位可能不同。查看方向由“Heading”、“Pitch”和“Roll”属性的组合定义,这些属性可旋转、倾斜和滚动摄影机在地图中查看内容的方式。

Viewpoint

您可以使用相机使用Viewpoint属性定义您从(观察者)观看的坐标或您正在观看的位置(目标)。如果将“Viewpoint”设置为“LookFrom”,则摄影机查看位置将是观察者的坐标。如果将“Viewpoint”设置为“LookAt”,则摄影机查看位置将是目标的坐标。从地图视图的camera属性返回的摄影机将始终具有LookAt的视点。

MapTool

ArcGIS.Desktop.Maping.MapTool是一个抽象基类,它提供了ArcGIS.Desktop.SFramework.Contracts.Tool的基本实现,并表示用于在MapView上执行交互操作的工具命令。
它提供了可以重写的虚拟方法,以便在地图视图中发生键盘和鼠标事件时执行操作。它还提供了可以设置为配置工具行为的属性,以及在与视图交互时包装公共函数的方法。该基类将用于创建工具,以交互方式识别和选择视图中的特征,以及创建自定义构造和编辑工具。

Declaring a Map Tool

映射工具被添加到外接程序Config.daml的<controls>部分。与按钮一样,地图工具应该在包含它们的组中引用,而组本身也应该在显示它们的各个选项卡中引用。它们有一个对应的代码隐藏文件,其中包含映射工具“类”实现,它也应该在工具daml中引用。例如:

<modules><insertModule id="..." ... caption="Module1"><tabs><tab id="ProAppModule1_Tab1" caption="New Tab"><group refID="ProAppModule1_Group1"/><!-- reference the group here --></tab></tabs><groups><group id="ProAppModule1_Group1" caption="Group 1"><tool refID="ProAppModule1_MapTool1" size="large" /><!-- reference the tool in the group(s) --></group></groups><controls><!-- define the tool element --><tool id="ProAppModule1_MapTool1" caption="MapTool 1" className="MapTool1" ... /></controls></insertModule></modules>

这是下面的地图工具代码:

///<summary>
///MapTool1 derives from the class. Note: MapTool1 is referenced in the className attribute of its tool element in the Config.daml
///</summary>
internal class MapTool1 : MapTool
{public MapTool1() {...}...
}

Pro SDK包含ArcGIS Pro Map Tool模板,该模板可自动执行创建基本地图工具所需的大部分daml和代码隐藏类文件定义。只需运行Pro SDK映射工具模板即可自动生成工具daml和类文件定义。

Using Conditions

地图工具的启用/禁用状态可以通过在工具daml元素上添加条件属性来控制。条件可以是:

  • 现有Pro条件(找到每个扩展ArcGIS Pro DAML ID参考的完整列表)
  • 自定义条件(了解如何在ProGuide Code Your Own States and conditions中创建自定义条件)
  • 窗格的daml id。
    如果工具的条件设置为窗格的daml-id,则只有当激活该类型窗格的实例时,才会启用工具。地图工具的默认条件由SDK地图工具模板设置为condition=“esri_maping_mapPane”,其中esri_Maping_mapPane是Pro MapView窗格元素的daml id。
<controls><!-- Enable our tool whenever a 2D or 3D map view is active. Disable it otherwise --><tool id="ProAppModule1_MapTool1" ... condition="esri_mapping_mapPane"><tooltip .../></tool>

Mouse and keyboard events

MapTool提供了几种虚拟方法,如OnToolMouseDown和OnToolKeyDown,当地图视图中发生相应事件时调用它们。通过在派生类中重写这些方法,可以在发生这些事件时执行操作。鼠标事件提供了事件参数,其中包含了一些信息,例如使用了哪个鼠标按钮,以及相对于发生事件的地图视图左上角的ClientPoint。客户端点可以传递到ClientToMap方法中,以返回映射中的相应位置。键盘事件提供了事件参数,该参数提供了诸如使用哪个键之类的信息。
这些虚拟方法旨在执行同步操作。如果需要执行任何异步代码,应将事件参数的handled属性设置为true。通过这样做,将使用相同的事件参数调用相应的Handle…Async虚拟方法。例如,要在按下鼠标左键时执行异步操作,您需要执行以下操作:


protected override void OnToolMouseDown(MapViewMouseButtonEventArgs  e)
{if (e.ChangedButton == System.Windows.Input.MouseButton.Left)e.Handled = true; //Handle the event to get the call to the async method
}protected override Task HandleMouseDownAsync(MapViewMouseButtonEventArgs e)
{return QueuedTask.Run(() =>{var mapPoint = MapView.Active.ClientToMap(e.ClientPoint);ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show(string.Format("X: {0} Y: {1} Z: {2}",mapPoint.X, mapPoint.Y, mapPoint.Z), "Map Coordinates");});
}

Creating a sketch

通过将IsSketchTool属性设置为true,该工具将使用鼠标左键单击在地图视图中创建草图。草图的几何图元类型可以使用SketchType特性设置,SketchOutputMode特性可以用于指定是在屏幕坐标还是地图坐标中创建草图几何图元。如果希望工具在绘制草图时捕捉,请将UseSnapping特性设置为true。如果IsSketchTool属性设置为false,则激活地图工具将使查看器处于默认模式,单击地图将不会创建草图。如果您已经对地图工具进行了编码,并试图弄清楚为什么它不能在鼠标左键单击时开始绘制草图,那么您可能忘记了将IsSketchTool属性设置为true。

internal class MapTool1 : MapTool
{public MapTool1() {IsSketchTool = true;//Activate sketching when we are activated...}

“进行中”草图通过受 protected OnSketchModifiedAsync()方法传递给地图工具。草图完成后,将调用虚拟方法OnSketchCompleteAsync,它将传递由草图创建的几何体。这两种方法都可以在映射工具中重写,以实现任何所需的自定义行为。
此代码段显示了地图工具的基本轮廓:


internal class MapTool1 : MapTool
{public MapTool1() {IsSketchTool = true;//Activate sketching when we are activatedSketchType = SketchGeometryType.Rectangle;SketchOutputMode =  SketchOutputMode.Map; //use SketchOutputMode.Screen for 3D selection;}protected override Task OnToolActivateAsync(bool hasMapViewChanged) {//TODO logic for when we are activated}protected override Task OnToolDeactivateAsync(bool hasMapViewChanged) {//TODO logic for when we are deactivated}protected async override Task<bool> OnSketchModifiedAsync() {//TODO - the sketch has been modified on the MapView//For example, access the sketchvar sketch = this.ActiveMapView.GetCurrentSketchAsync();//Do something...return true;}protected override Task<bool> OnSketchCompleteAsync(Geometry geometry) {//TODO - work with the sketch}
}

当使用SelectFeature或GetFeatures方法执行交互式选择或识别时,需要注意的是,3D中仅支持屏幕坐标中的几何图形。在2D中,支持地图和屏幕几何图形。

Active Map Tool

Pro中的地图工具与地图窗格紧密相连(地图窗格是单个地图视图的“容器”)。在daml中声明窗格时,可以指定默认工具。创建窗格实例时,将自动选择默认工具。使用多个窗格并在它们之间移动时,活动工具可能会自动更改以反映正在激活的窗格。返回原始窗格时,系统将尝试重新激活该窗格类型的最近使用的工具。以下是ADMapping.daml内容,它将Proexplore工具的赋值显示为地图窗格默认值。

<panes><pane id="esri_mapping_mapPane" caption="Map" ... defaultTool="esri_mapping_exploreTool">...</pane>

Animation

动画是创建一系列连续图像的过程,并快速播放这些图像以创建运动幻觉。每一幅图像,就像你用相机拍摄的照片一样,都在时间上标记了一个重要的实例,称为关键帧。在ArcGIS Pro中,动画是通过定义一组关键帧来创作的,系统使用这些关键帧来创建插值中间帧。动画可以插值摄影机位置、贴图时间、贴图范围以及层可见性和透明度。
可以通过“动画”属性访问贴图的动画。此属性是一个Animation类,用于存储作为关键帧容器的轨迹集合。轨迹从tracks属性返回,此属性始终返回4个轨迹:CameraTrack、TimeTrack、RangeTrack和LayerTrack。每个轨迹存储相应关键帧类型的集合:CameraKeyframe、TimeKeyframe,RangeKeyframe和LayerKeyframe。除了创建和删除关键帧之外,轨迹还用于获取关键帧集合。

public List<CameraKeyframe> GetCameraKeyframes()
{var mapView = MapView.Active;if (mapView != null)return null;var animation = mapView.Map.Animation;//There will always be only 1 CameraTrack in the animation.var cameraTrack = animation.Tracks.OfType<CameraTrack>().First(); return cameraTrack.Keyframes.OfType<CameraKeyframe>().ToList();
}

关键帧是地图或场景中沿动画路径的视觉路径点。播放动画时,将使用可配置的过渡类型在关键帧定义的存储状态之间插入值,例如摄影机的位置、当前贴图时间、当前贴图范围和层透明度。关键帧存储一个或多个值、每个值的过渡以及它在轨迹中存在的时间。过渡类型定义了如何将值从上一个关键帧中的相应值插值到其值。

例如,假设在一个轨迹中有2个关键帧,一个在0秒的时间,另一个在3秒的时间。第一个关键帧的X值为1,第二个关键帧X值为5。第二个帧将X的变换定义为“线性”。这意味着在动画中0秒时X为1,在3秒时X是5,在1.5秒时或在X值的中间将是3。

如果我们将此示例应用于具有多个值(包括X、Y、Z、Pitch、Heading和Roll)的摄影机,这些值定义了查看位置和查看旋转,则除了每个
值的变换外,CameraKeyframe还将存储所有这些值。这些值和过渡定义了摄影机在动画期间移动的路径。

MapControl

MapControl是一个可重用的控件,可以嵌入在停靠窗格、视图窗格或对话框中,用于显示项目项,如2D和3D地图、要素图层、光栅数据集、图层包等。下面的代码段显示了如何在XAML中添加地图控件:

<mapControls:MapControl Name="mapControl" Grid.Row="1" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Height="275"ViewContent="{Binding Path=MapContent}" Camera="{Binding CameraProperty}">
</mapControls:MapControl>

如上面的代码段所示,您绑定到地图控件的ViewContent属性以定义控件中当前显示的内容,并绑定Camera属性以在地图控件中导航。还可以绑定到Extent属性以控制地图控件的范围。

ViewContent的类型为MapControlContent。静态MapControlContentFactory类用于创建映射控件内容。MapControlContentFactory类上的IsItemSupported方法可用于确定是否可以将特定项添加到映射控件。如果支持项,则可以使用MapControlContentFactory的Create方法的各种重载来创建映射控件内容。
下面的示例显示了如何从“项目”窗格或视图中当前选定的项创建地图控件内容:

private MapControlContent CreateContentFromItem()
{var curProj = Project.Current;var selectedItem = ((curProj != null) && (curProj.SelectedItems.Count == 1)) ? curProj.SelectedItems[0] : null;if (selectedItem == null || !MapControlContentFactory.IsItemSupported(selectedItem))return null;Camera camera = null;return MapControlContentFactory.Create(new[] { selectedItem }, camera, ArcGIS.Core.CIM.MapViewingMode.Map);
}

这是如何从项目中当前活动的地图创建地图控件内容的示例:

var currentMap = MapView.Active.Map;
MapControlContent _mapContent = MapControlContentFactory.Create(currentMap, MapView.Active.Extent, currentMap.DefaultViewingMode);

映射控件上的其他属性包括IsReady只读属性。可以通过查询来确定地图控件是否准备好接受用户输入。例如,在更新地图控制相机之前,可以执行以下检查:

if (MapControlWindow._mapControl.IsReady)
{//Update the map control camera
}

您还可以绑定到xaml中的IsReady属性以启用或禁用其他控件。下面的代码段显示了如何将按钮的启用状态绑定到映射控件的IsReady属性:

<Button  Name="TestButton" DockPanel.Dock="Right" Style="{StaticResource buttonStyle}" Click="OnButtonClick" IsEnabled="{Binding Path=IsReady, ElementName=mapControl}">
</Button>

与IsReady属性类似的是只读IsDrawing属性,可以查询该属性以确定控件当前是否正在绘制视图内容。IsDrawing属性的一个示例用法是在绘制内容时为用户反馈显示微调器。
注意-虽然您可以将另一个控件的属性绑定到映射控件的IsReady或IsDrawing属性,如上面的XAML代码段所示,但无法按如下方式绑定这些属性-下面的XAML会给出错误,因为IsReady是只读依赖属性:

<mapControls:MapControl Name="mapControl" Grid.Row="1" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Height="275"ViewContent="{Binding Path=MapContent}" Camera="{Binding CameraProperty}"IsReady ="{Binding MapControlIsReady}></mapControls:MapControl>

还有一个OverlayControl属性,可用于在地图控件中显示图像、文本等覆盖。下面的XAML代码段显示了一个示例,其中一些文本显示在地图控件的中心:

<mapControls:MapControl.OverlayControl><Grid><TextBlock TextWrapping="Wrap" VerticalAlignment="Center" HorizontalAlignment="Center">This is a simple example of using the <Bold>OverlayControl</Bold> to draw text in the map control. </TextBlock></Grid>
</mapControls:MapControl.OverlayControl>

注意-MapControl是一个本机控件,如果它放置在透明的本机窗口中,则MapControl也将是透明的,不会显示。例如,如果通过将MapControl与MapTool关联,将其用作可嵌入控件,则MapControl将托管在透明的本地窗口中,并且将不可见。

map控件引发了许多事件,您可以通过这些事件来获取信息。ControlInitialized事件在初始化并准备接收用户输入时引发。其他事件包括ViewContentLoaded、DrawStarted、DrewComplete、CameraChanged和ExtentChanged。可以通过处理这些事件来执行特定操作。

使用Map控件的示例可以在OverviewMapControl和MagnifierWindow中找到

TableControl

TableControl是一个可重用的控件,可以嵌入窗格、停靠窗格或对话框中,用于显示活动地图中的地图成员的内容或目录视图中的项目。下面的代码段显示了如何在XAML中添加表控件:(请注意,TableControl位于ArcGIS.Desktop.Editing.Controls命名空间中。)

<editingControls:TableControl AutomationProperties.AutomationId="_tableControl" x:Name="tableControl" VerticalAlignment="Stretch"HorizontalAlignment="Stretch"TableContent="{Binding Path=TableContent}">
</editingControls:TableControl>

可以绑定表控件的TableContent属性以定义控件中显示的内容。此属性的类型为TableControlContent,它是使用静态TableControlContentFactory类创建的。TableControlContentFactory上的IsMapMemberSupported或IsItemSupported函数确定是否可以从mapMember或Catalog项创建内容并显示在表控件中。
下面的示例从支持的映射成员项创建表控件内容:

private TableControlContent CreateTableControlContent()
{var selectedLyrs = MapView.Active.GetSelectedLayers();var selectedSTs = MapView.Active.GetSelectedStandaloneTables();MapMember item = null;if (selectedLyrs != null && selectedLyrs.Count == 1){item = selectedLyrs[0];}else if (selectedSTs != null && selectedSTs.Count == 1){item = selectedSTs[0];}if ((item != null) && TableControlContentFactory.IsMapMemberSupported(item))return TableControlContentFactory.Create(item);return null;
}

这是从“目录”窗格中的选定项创建表控件内容的示例。

private TableControlContent CreateTableControlContentFromItem()
{var catalogPane = Project.GetCatalogPane();var item = catalogPane.SelectedItems.FirstOrDefault();if ((item != null) && TableControlContentFactory.IsItemSupported(item))return TableControlContentFactory.Create(item);return null;
}

静态TableControlCommands类提供了许多用于表控件的命令。下面是一个片段,展示了如何在xaml中定义它们。特别注意CommandTarget属性。必须引用表控件的Name属性,否则命令没有正确的上下文,将无法执行。

<Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions><DockPanel LastChildFill="False" Grid.Row="0"><Button Content="Toggle Sel" Command="editingControls:TableControlCommands.SwitchSelection"CommandTarget="{Binding ElementName=tableControl}"Style="{DynamicResource Esri_Button}"/><Button Content="Select All" Command="editingControls:TableControlCommands.SelectAll"CommandTarget="{Binding ElementName=tableControl}"Style="{DynamicResource Esri_Button}"/><Button Content="Clear Sel" Command="editingControls:TableControlCommands.ClearSelection"CommandTarget="{Binding ElementName=tableControl}"Style="{DynamicResource Esri_Button}"/></DockPanel><editingControls:TableControl AutomationProperties.AutomationId="_tableControl" x:Name="tableControl" Grid.Row="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"TableContent="{Binding Path=TableContent}" ></editingControls:TableControl></Grid>

TableControlCommands中的命令所公开的功能也可以作为表控件类本身的方法使用。例如,有CanSwitchSelection和SwitchSelection、CanClearSelection和ClearSelecttion以及CanSelectAll和SelectAll方法。如果需要将它们与其他功能结合,请在ViewModel或代码隐藏中使用它们。
在ArcGIS Pro 2.9中,还可以使用代码中的CanGoTo和GoTo方法或静态TableControlCommands显示Go To UI。xaml中的GoTo属性。类似地,可以通过代码中的CanFind和Find方法或静态TableControlCommands显示FindUI。在xaml中查找。请注意,只能显示“查找”界面;“查找和替换”UI不适用,因为表控件以只读模式显示数据。
TableControl上的其他重要属性包括ViewMode,它允许您在“所有记录”或“选定记录”模式下切换控件;设置TableControl的活动字段的ActiveFieldIndex,以及设置活动行的ActiveRowIndex。
还可以通过绑定到RowContextMenu、SelectedRowContext Menu和ColumnContextMenu属性来自定义行或列上下文菜单。
IsRowCountKnown属性确定控件是否知道数据源的行计数。在访问RowCount属性或选择所有行之前,可以将此只读属性用作检查。

Table控件主要使用行索引操作。可以通过更改ActiveRowIndex来修改当前行。或者,您可以使用BringIntoView方法修改当前行,并确保表也滚动到该行。但是,在许多情况下,您可能只知道希望成为当前行的ObjectID。在ArcGIS Pro 2.9中,您可以使用GetRowIndex或GetRowIndexAsync方法确定数据集中给定ObjectID的行索引。如果希望知道特定行索引处的ObjectID,可以使用GetObjectIdAsync方法。

Table控件引发了许多事件,您可以通过这些事件来获取信息。使用TableContentLoaded确定何时加载表内容,使用ActiveCellChanged确定何时更改活动单元格,或使用SelectedRowsChanged来确定选定行何时更改。
使用Table控件的示例可以在TableControl中找到。ProGuide TableControl提供了附加文档,并随示例一起提供。

MapView Graphic Overlay MapView图形叠加

可以使用与地图或场景视图关联的“图形覆盖”将临时图形添加到地图视图或场景视图。覆盖用于显示视图关闭时未持久化的临时数据。覆盖图形使用几何图形来定义,以指定其位置和相应的CIM符号(技术上是CIM符号参考)。也可以使用CIMGraphic(将几何图形和符号组合为一个实体)。图形可以是点、线、多边形或文本(包括详图索引)。
在下图中,一个用星形符号表示的点几何体被添加到覆盖层中。此外,还添加了第二个文本图形,使用标注将标签“添加”到星形。

要创建图形覆盖,请使用MapView AddOverlay方法之一。此方法有多个使用几何体和符号引用的重载;CIMGraphic;或特征oid(用于位置)和符号参考。

public static IDisposable AddOverlay(MapView mapView, Geometry geometry, CIMSymbolReference symbol, double referenceScale = -1)
public static IDisposable AddOverlay(MapView mapView, Geometry geometry, CIMSymbolReference symbol, double referenceScale, double showThrough)
public static IDisposable AddOverlay(MapView mapView, CIMGraphic graphic, double referenceScale = -1)
public static IDisposable AddOverlay(MapView mapView, CIMGraphic graphic, double referenceScale, double showThrough)
public static IDisposable AddOverlay(MapView mapView, Layer layer, long oid, CIMSymbolReference symbol = null, double referenceScale = -1)

在上述方法中,referenceScale是可选参数。showThrough参数仅在3D中使用,是一个可见性因子,用于在遮蔽时通过其他对象显示覆盖。

AddOverlay方法返回可用于清除图形的IDisposable。要删除图形,请对返回的IDisposable(例如_graphic.Dispose())调用“Dispose”。如果需要维护对IDisposable的引用,请将其保存在成员变量中。如果不删除图形,则在地图视图关闭时将自动删除该图形。
下面的代码片段演示了如何使用几何图形和CIM符号(参考)创建图形。

  private IDisposable _graphic = null; //defined elsewhere// Add point graphic to the overlay at the center of the mapView// Note: Run within QueuedTask.Run_graphic = mapView.AddOverlay(mapView.Extent.Center, SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.RedRGB, 40.0, SimpleMarkerStyle.Star).MakeSymbolReference());// Note: Update graphic using UpdateOverlay// mapView.UpdateOverlay(_graphic,...);_graphic.Dispose(); //Removes the graphic

MapView Overlay Control

WPF用户控件也可以使用作为参数传递给mapview.AddOverlayControl(…)的MapViewOverlay控件包装添加到地图视图或场景的“顶部”。

要在Pro的地图视图上添加用户控件,首先创建一个MapViewOverlayControl。MapViewOverlayControl构造函数中的第一个参数是要显示在地图视图顶部的WPF用户控件。MapViewOverlayControl构造函数有参数来配置用户控件的显示和行为的各个方面,例如其初始位置,以及是否可以移动或调整大小等。

public MapViewOverlayControl( FrameworkElement control,bool canMove,bool canResizeHorizontally,bool canResizeVertically,OverlayControlRelativePosition relativePosition,double initialXRatio,double initialYRatio
)

您可以创建一个简单的WPF用户控件xaml(在本例中,两个文本块被一个栗色边框包围):

<UserControl x:Class="OverlayControlExample.OverlayTestingControl"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"...><Grid><Border Background="Beige" BorderBrush="Maroon" BorderThickness="4"><StackPanel Orientation="Vertical" ><TextBlock FontSize="20" FontWeight="Bold" Margin="50, 10"> MapView Overlay Control</TextBlock><TextBlock FontSize="20" FontWeight="Bold" Margin="50, 20"><Run Text="Insert controls here."/></TextBlock></StackPanel></Border>            </Grid>
</UserControl>

要将自定义用户控件添加到地图视图覆盖中,我们将用户控件的实例与所需的放置设置一起传递给MapViewOverlayControl构造函数。然后调用MapView.AddOverlayControl将用户控件添加到地图视图覆盖:

//instantiates the control
var exampleControl = new OverlayTestingControl();//allow it to be moved and resized
var MapViewOverlayControl = new MapViewOverlayControl(exampleControl, true, true, true, OverlayControlRelativePosition.TopLeft);//add the wrapper to the overlay
mapView.AddOverlayControl(MapViewOverlayControl);

创建WPF控件的另一种方法是创建可嵌入控件;这为您提供了一个视图和一个视图模型对。如果UI更复杂,并且需要数据绑定来更新UI上的信息,这可能很有用。可嵌入控件在esri_embeddableControls类别的daml中注册,并具有唯一的ID。

  <categories><updateCategory refID="esri_embeddableControls"><insertComponent id="OverlayControlExample_EmbeddableControl1" className="EmbeddableControl1ViewModel"><content className="EmbeddableControl1View" /></insertComponent></updateCategory></categories>

这个daml标识符可以传递给EmbeddableControl.Create方法创建视图和视图模型对。将可嵌入控件添加到覆盖的代码如下

//instantiates the embeddable control and sets datacontext
var tuple = EmbeddableControl.Create("OverlayControlExample_EmbeddableControl1");
//Get the user control (view)
var exampleControl = tuple.Item2 as EmbeddableControl1View;//allow it to be moved and resized
var MapViewOverlayControl = new MapViewOverlayControl(exampleControl, true, true, true, OverlayControlRelativePosition.TopLeft);//add the wrapper to the overlay
mapView.AddOverlayControl(MapViewOverlayControl);

如果以后需要访问,MapViewOverlayControl对象应该保存在成员变量中,或者在不再需要时发送给RemoveOverlay控件(并且应该从覆盖中删除)。如果未调用RemoveOverlayControl,则在地图视图关闭时会自动删除覆盖控件。

参考
添加地图

arcgis pro 地图相关推荐

  1. ArcGIS Pro地图和场景

    目录 1 地图和场景 1.1 地图 1.2 场景 2 图层 2.1 图层类型 2.1.1 要素图层(Feature layers) 2.1.2 栅格图层(Raster layers) 2.1.3 场景 ...

  2. 基于ArcGIS Pro 的AI地图配色工具

    唠叨几句 几周前(貌似是,具体忘了)深夜发文,写了一篇AI地图配色的文章,经同事领导的转发也收到了不少反馈,大多都是求教程.其实你让小编教我也不知怎么教,因为大家可能以为是拉拉工具就能实现的.其实不然 ...

  3. 【ArcGIS Pro二次开发】(7):地图(Map)的基本操作

    地图是ArcGIS Pro中的基础起点,也是大多数工程的基础.主要用于显示表示空间数据的图层. 一.地图(Map)的基本操作示例 1.获取当前地图 var map = MapView.Active.M ...

  4. 开源方案搭建可离线的精美矢量切片地图服务-7.Arcgis Pro企业级应用

    系列文章目录 开源方案搭建可离线的精美矢量切片地图服务-1.开篇(附成果演示地址) 开源方案搭建可离线的精美矢量切片地图服务-2.PostGIS+GeoServer矢量切片 开源方案搭建可离线的精美矢 ...

  5. 研究区域制图 | 在 ArcGIS Pro中创建地图布局

    研究区域制图 | 在 ArcGIS Pro中创建地图布局 数据准备 首先需要两个图层,一个是市区图层,一个是省行政区划图层,我这里以吉林省以及吉林省长春市为例 新建布局 选择横向A5即可 添加参考线 ...

  6. ArcGIS Pro 共享地图(MPKX)

    目录 1.MPKX 2.创建地图包 2.1 打开地图加载数据 2.2 新建地图包 2.3 保存包的位置 2.4 标签和摘要 2.5 包含企业数据和UNV路径数据 2.6 共享方式 2.7 附件 2.8 ...

  7. ArcGIS Pro常见地图包系列--移动地图包(MMPK)

    1. 什么是移动地图包 同时包含地图.底图以及这些图层引用的所有数据.ArcGIS Pro.Navigator for ArcGIS 以及开发人员使用 ArcGIS Runtime 构建的应用程序可以 ...

  8. 【ArcGIS Pro】 发布web地图

    一.登录门户 1.首先进入ArcGIS Online官网,申请一个账号.登录进去后首页的网址就是稍后门户的网址.记得登录的网页不要关闭,为了确保待会账号能登上ArcGIS Pro的门户. https: ...

  9. 【ArcGIS Pro微课1000例】0017:ArcGIS Pro 2.8制作炫酷的ETOPO1全球DEM地图

    ArcGIS Pro相对于ArcGIS,在制图方面做了很大的提升,做出的地图更加优美,本文讲解基于NOAA的ETOPO1数据全球DEM数据制作炫酷的全球DEM地图,先看效果再教学! 1. 效果展示 全 ...

最新文章

  1. python 测试用例中设置执行时间_Python基于unittest实现测试用例执行
  2. 踩坑日记:Logstash同步数据库有type字段导致同步失败
  3. linux socket API / socket
  4. LTE TDD的特殊子帧
  5. 列运算_Power Query列运算的几种方法比较
  6. 假设前置数据法|全网唯一
  7. 主进程和子进程_Python - 进程-线程-协程
  8. AndroidStudio使用opencv,android开发项目实例
  9. android游戏策划方案,游戏策划案模板.doc
  10. Markdown编辑器使用教程_被迫流浪者的博客
  11. 星上SAR实时处理调研2-典型应用
  12. 虚拟机Ubuntu复制粘贴到主机(不安装vmware-tools实现两者之间文件共享)
  13. 【产业互联网周报】房企分拆物业公司上市潮来临,“智慧社区”加码;旷视智慧物流业务定位及战略布局;京东健康与药明康德入股卫宁科技...
  14. 《面向对象分析与设计》一3.7 例题
  15. 异地多活与CAP原理
  16. 转载:java面试题(一)
  17. Python避免缩进错误
  18. On the Factory Floor: ML Engineering for Industrial-Scale Ads Recommendation Models笔记
  19. php大商创商城,news.php · Mihok/ecshop大商创商城 - Gitee.com
  20. Infragistics控件使用

热门文章

  1. SSH 文件操作命令
  2. 17.sql server数据库使用规则、二八原则、数据库查询集群--数据库读写分离多种实现、数据库配置读写分离(by-朝夕)
  3. 南安一中八十年校庆征文 陈建春老师
  4. knockout js之select
  5. Protobuf 了解
  6. Javapython实现网页内容自动识别与提取技术实现
  7. Github项目文档的管理
  8. Goddy服务器配置
  9. 【文献翻译】Epileptic Seizures Detection Using Deep Learning Techniques: A Review
  10. 两化融合能给企业带来什么好处