ArcGIS Runtime数据加载及编辑同步

0
分享 2015-12-12
1.1 ArcGIS Runtime数据加载过程探讨
在文档《ArGIS Runtime 快速入门》中我们对ArcGIS Runtime的运行机制做了剖析,我们清楚的知道,在ArcGIS Runtime中一切都可以看做服务,因为对本地数据(MPK,APK,GPK)的显示,实际是通过ArcGIS Runtime 内部的Web服务器将这些本地数据作为服务发布出来,然后通过自己提供的API进行使用,当然这一切对我们都是一个“黑箱子”,其实对于ArcGIS Runtime 本地数据的加载还有深究,最近抽空将这个整理出来跟大家交流。
我们知道ArcGIS Runtime所使用的本地数据(MPK,APK,GPK)是通过ArcMap来制作的,它的这些数据是一种“包”数据,当我们将数据制作成这个“包“的时候,ArcMap为我们做了什么呢?这些”包”本质上是一个压缩文件,在这里我用MPK说明下。
我将自己制作的MPK文件后缀名改成zip,然后解压,发现这个解压后的文件由两部分组成,如下图:


在V101(我猜测应该是verison10.1的缩写)这个文件夹中,包含gdb,msd和mxd三个文件,如下图:


gdb中包含我们这个地图文档所需要的地图数据,msd是在打包的过程中生成的,我们再看另外一个文件夹esriinfo,该文件夹包含下列三个文件:


Thumbnail文件夹中包含该数据包的一个缩略图,如下:


另外两个文件比较小,都是XML的,包含对当前数据的描述信息,比如名称,空间参考等,大家不妨打开看看。

了解了MPK的本质,再看看ArcGIS Runtime是如何加载的?

1. 启动本地服务;
这是是使用本地数据(MPK)等必须的操作。
2. 解压;
这一步将我们的MPK数据
解压到C:\Users\Administrator\Documents\ArcGIS\Packages目录下。
3. 发布服务
将上面解压的数据发布为服务;
4. 使用服务
这时候就可以使用该服务,然后将该数据显示出来。

1.2 ArcGIS Runtime数据编辑同步
通过上面的介绍,我们更加清楚ArcGIS Runtime使用本地数据的整个流程,但是这里带来一个问题,ArcGIS Runtime对编辑的数据如何同步操作,因为我们从上面的步骤可以看出,ArcGIS Runtime将我们的数据解压到另外一个目录下,以后使用数据的时候都是用该目录下的数据,和原来的数据没有任何关系,如果我对数据编辑后,岂不是没法同步?在这里我想告诉有这个疑虑的人,放十万个心,这里的这个问题其实可以解决,最笨的办法就是将编辑后的数据导出,然后又导入到我们要同步的库中,相信这个方法我们都可以想出来,但是这不是真正意义上的同步吧?要解决这个问题,我们要回到数据打包的这个操作中来,更多信息请看http://blog.csdn.net/arcgis_cs ... 82523,ArcGIS Runtime在制作数据包的时候,可以对数据采用引用的方式,在打包的时候,选中引用数据这个选项,如下图:


这种就是打包后的数据mxd或者msd文档中使用的数据还是原来库中的数据,而不是使用那个V101目录下gdb中的数据,再进一步可以看到这个采用引用方式打包后的数据的那个V101目录下根本就没有这个gdb数据库,如下图:




1.3 验证
当采用引用的方式打包数据后,我们在ArcGIS Runtime中对该数据进行编辑,同时在ArcMap中打开该地图文档,可以看看有没有变化,核心代码如下:

ArcGISLocalFeatureLayer pLocalFeatureLayer = new ArcGISLocalFeatureLayer(@"D:\2012\Runtime\径向流图\flow.mpk", 7);
pLocalFeatureLayer.Editable =true;

pLocalFeatureLayer.ID ="cities";

pLocalFeatureLayer.OutFields.Add("*");

// ArcGISLocalFeatureLayer pLocalFeatureLayer1 = new ArcGISLocalFeatureLayer(pLocalDym.Path, 5);

MyMap.Layers.Add(pLocalFeatureLayer);


LocalGeometryService.GetServiceAsync((e) =>
{
if (e.Status ==LocalServiceStatus.Running)
{
MyEditorWidget.GeometryServiceUrl =e.UrlGeometryService;

string[]myLayerIDs = {"cities"};

MyEditorWidget.LayerIDs =myLayerIDs;

MyEditorWidget.AutoSelect =false;
MyEditorWidget.ShowAttributesOnAdd =true;
MyEditorWidget.EditCompleted +=newEventHandler<Editor.EditEventArgs>(MyEditorWidget_EditCompleted);


}
});
});
XMAL代码如下:
<Grid x:Name="LayoutRoot">
<Grid.Resources>
<LinearGradientBrush x:Key="PanelGradient" EndPoint="0.5,1" StartPoint="0.5,0">
<LinearGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterY="0.5" CenterX="0.5"/>
<SkewTransform CenterY="0.5" CenterX="0.5"/>
<RotateTransform Angle="176" CenterY="0.5" CenterX="0.5"/>
<TranslateTransform/>
</TransformGroup>
</LinearGradientBrush.RelativeTransform>
<GradientStop Color="#FF145787"/>
<GradientStop Color="#FF3D7FAC" Offset="0.184"/>
<GradientStop Color="#FF88C5EF" Offset="0.984"/>
</LinearGradientBrush>
</Grid.Resources>

<esri:Map x:Name="MyMap" WrapAround="True">

</esri:Map>

<StackPanel x:Name="EditorToolStrip" Margin="0,5,5,0" >
<Border Background="{StaticResource PanelGradient}" BorderThickness="1" CornerRadius="5"
HorizontalAlignment="Right" VerticalAlignment="Top"
Padding="5" BorderBrush="Black">
<Border.Effect>
<DropShadowEffect Color="Black" Direction="-45" BlurRadius="20" Opacity=".75" />
</Border.Effect>
<StackPanel Orientation="Vertical" HorizontalAlignment="Right" Margin="0,5,5,0" VerticalAlignment="Top" >
<esri:EditorWidget x:Name="MyEditorWidget" Map="{Binding ElementName=MyMap}"
Width="300"
/>
</StackPanel>
</Border>
</StackPanel>


</Grid>

选择编辑图层上的所有数据,有2544个如下图:


在ArcGIS Runtime中,添加一个点,并添加属性如下:


在ArcMap中刷新后,就可以看到我们可以找出这个元素了,如下图:


ArcGIS Runtime是轻量级的桌面产品,做出的应用非常的漂亮,开发简单,部署容易,便于携带,并且有优越的性能,对于数据的同步也有相应的解决办法,这些对用户来说都是不错的选择!
文章来源:http://blog.csdn.net/arcgis_all/article/details/8215189

0 个评论

要回复文章请先登录注册