原文地址:http://www.gisall.com/html/63/151663-6820.html
ArcGIS Runtime 支持MPK,APK,TPK,GPK这些打包之后的数据,这些也都是ArcGIS 10.1 中新增的数据格式(MPK除外,MPK是在ArcGIS 10中增加的,但是并不能支持ArcGIS Runtime),我们经常使用的数据可能并不是这些打包后的数据,而是shape这样的数据,我们如何加载shape数据呢?加载了shape数据,我们又如何编辑呢?
我们知道ArcGIS Runtime中有一种类型的图层叫做GraphicsLayer,它是用来显示我们的一些符号化的几何对象——Graphic,Graphic由Gemoetry+属性+符号组成。
Shape数据格式的公开的,这样只要我们按照其规范就可以从底层写读取shape文件的程序,但是我们没有必要这么做,因为在网上有有很多开源的读取shape数据的类库,如GDAL/OGR,SharMap类库等,有了这些类库,我们就有一个想法,借助这些类库将shp数据读取出来,然后转成能在GraphicsLayer图层上显示的东东。到了这里我们需要做的就是将shape文件中读取出来的几何图形对象转成Graphic的几何对象,这一个步骤也有人做了。在http://esrislcontrib.codeplex.com/上,就提到了读取shape文件的shapefilereader类。该类里面有一个非常好的方法ToGraphic(),该方法直接将读取的shape转成了Graphic,有了Graphic,我们就可以将Graphic显示在Map中了
读取shape数据
核心代码
private
void button3_Click(object
sender, RoutedEventArgs
e)
{
OpenFileDialog
pOpenShpFile = new
OpenFileDialog();
pOpenShpFile.Multiselect =
false;
pOpenShpFile.Filter =
"Shapefile(.shp)|*.shp";
string
pFileName = "";
if (pOpenShpFile.ShowDialog() ==
true)
{
if (pOpenShpFile.FileName.Length > 0)
{
pFileName =
pOpenShpFile.FileName;
FileInfo
pShpInfo = new
FileInfo(pFileName);
ShapeFile
pShapeReader = new
ShapeFile();
//pShapeReader.Read(pShpInfo, new FileInfo(pFileName.Replace(".shp", ".dbf")));
//该方法只读shape
pShapeReader.ReadShapes(pShpInfo);
pShapeReader.ReadShapes(pShpInfo);
Collection<ShapeFileRecord>
pShapeRecords = pShapeReader.Records;
foreach (ShapeFileRecord
pRecord in
pShapeRecords)
{
Graphic
pGraphic = ExtensionMethods.ToGraphic(pRecord);
pGraphicsLayer.Graphics.Add(pGraphic);
}
MyMap.Extent =
pGraphicsLayer.FullExtent;
}
}
}
红色部分的为添加的shape点状类型的数据
编辑Shape数据
ArcGIS Runtime对数据提供了编辑功能,但是编辑也是通过FeatureLayer来实现的,如何编辑shape数据呢?
相信很多人已经对GDAL了解,GDAL有一个分支OGR,OGR是专门用来对矢量数据的支持,在这里简单对OGR的体系结构坐下介绍
OGR包括如下几部分:
Geometry:类Geometry(包括OGRGeometry等类)封装了OpenGIS的矢量数据模型,并提供了一些几何操作,WKB(Well KnowsBinary)和WKT(Well Known Text)格式之间的相互转换,以及空间参考系统(投影)。
Spatial Reference:类OGRSpatialReference封装了投影和基准面的定义。
Feature:类OGRFeature封装了一个完整feature的定义,一个完整的feature包括一个geometry和geometry的一系列属性。
Feature Definition:类OGRFeatureDefn里面封装了feature的属性,类型、名称及其默认的空间参考系统等。一个OGRFeatureDefn对象通常与一个层(layer)对应。
Layer:类OGRLayer是一个抽象基类,表示数据源类OGRDataSource里面的一层要素(feature)。
Data Source:类OGRDataSource是一个抽象基类,表示含有OGRLayer对象的一个文件或一个数据库。
Drivers:类OGRSFDriver对应于每一个所支持的矢量文件格式。类OGRSFDriver由类OGRSFDriverRegistrar来注册和管理。
对SHP数据的编辑,我们只要将我们在GraphicsLayer上绘制的Graphic转成OGR支持的Geometry就可以了
核心代码
全局变量
OSGeo.OGR.DataSource
pDS;
OSGeo.OGR.Layer
pLayer;
private
void button3_Click(object
sender, RoutedEventArgs
e)
{
OpenFileDialog
pOpenShpFile = new
OpenFileDialog();
pOpenShpFile.Multiselect =
false;
pOpenShpFile.Filter =
"Shapefile(.shp)|*.shp";
string
pFileName = "";
if (pOpenShpFile.ShowDialog() ==
true)
{
if (pOpenShpFile.FileName.Length > 0)
{
pFileName =
pOpenShpFile.FileName;
//shape文件驱动文件名称
string
pszDriverName = "ESRI Shapefile";
//注册驱动
OSGeo.OGR.Ogr.RegisterAll();
//调用对Shape文件读写的Driver接口
OSGeo.OGR.Driver
pDriver = OSGeo.OGR.Ogr.GetDriverByName(pszDriverName);
if (pDriver ==
null)
MessageBox.Show("驱动");
//用此Driver打开Shape文件,1
表示更新
pDS =
pDriver.Open(pFileName, 1);
if (pDS ==
null)
MessageBox.Show("打开数据源错误");
//获取图等
pLayer =
pDS.GetLayerByIndex(0);
if (pLayer ==
null)
MessageBox.Show("Layer Creation Failed");
//获取几何类型
wkbGeometryType
pGeoType = pLayer.GetLayerDefn().GetGeomType();
// 获取空间参考
OSGeo.OSR.SpatialReference
pSpatial = pLayer.GetSpatialRef();
}
}
}
//传入我们在地图上的点
void
Test(MapPoint
pMapPoint)
{
//创建一个Feature,一个Point
OSGeo.OGR.Feature
pFeature = new
Feature(pLayer.GetLayerDefn());
OSGeo.OGR.Geometry
pPointGeo = new
OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbPoint);
pPointGeo.AddPoint(pMapPoint.X,
pMapPoint.Y, 0);
//字段个数,不包括ObjectID和FID
int
pFCount = pFeature.GetFieldCount();
pFeature.SetField(1, 3.6);
pFeature.SetGeometry(pPointGeo);
//pFeature.SetGeometryDirectly(pPointGeo);
pLayer.CreateFeature(pFeature);
//写入文件
pLayer.SyncToDisk();
//关闭文件读写
pFeature.Dispose();
// pLayer.Dispose();
// pDS.Dispose();
}
编号为29的为我们新增的点
结论
由于我现在拿到的ArcGIS Runtime软件不是最终的,目前还不能直接对Shape数据实现加载和编辑,但是通过开源的类库,我们可以很好的使用ArcGIS Runtime对shape数据实现加载和编辑,感谢Esri,感谢他们将Shape数据结构公开,文中通过实例说明了对shape数据加载的和编辑的流程,通过这些我们可以看出,其实难点在于如何将shape文件中的几何对象转成Graphic的geometry,在1.2我们读取shape数据的时候,开源的类库直接提供了转到Graphic的方法,但是编辑的时候,目前我还没找到,但是只要我们将1.2的那个转向Graphic的方法逆转过来就应该是可以的,这一步还需要花点时间整理整理。
分享到:
相关推荐
ArcGIS Runtime SDK for Java 100.12.0 的...如需在生产环境中使用ArcGIS Runtime SDK for Java,请联系ESRI公司获得授权,现在也有国产替代产品GeoScne Runtime SDK for Java,可以联系易智瑞公司获得相关资源和授权。
arcgis runtime 加载百度,高德地图,腾讯地图,天地图,加载tif文件,加载shp文件,距离测算,要素修改,添加,删除,图层管理,定位,放大缩小等等功能点。亲测可用
arcgis runtime sdk for .net 100.4-100.6版本+arcgis runtime local server sdk 100.6,由于文件过大,百度网盘链接,有需要的朋友可以下载
ArcGIS Runtime SDK for WPF 10.2.5 版本破解License standard版本 测试可以使用,无弹出信息 测试环境:vs2013 win7_64
此dome是根据实际开发的来经验,根据在91卫图上下载arcgisserver离线瓦片数据,将瓦片数据放入IIS下进行部署,通过访问加载本地离线瓦片数据
ArcGIS Runtime SDK for Android开发介绍,来自Esri 中国技术人员的培训材料。
如题,ESRI官方下载的ArcGIS Runtime SDK for .NET v100.3 官方开发包,方便没有帐号的同志们下载。开发包较大,但请勿使用迅雷下载。
Esri.ArcGISRuntime.100.3.0.nupkg Esri.ArcGISRuntime.LocalServices.100.3.0.nupkg Esri.ArcGISRuntime.Hydrography.100.3.0.nupkg Esri.ArcGISRuntime.UWP.100.3.0.nupkg Esri.ArcGISRuntime.Xamarin.Forms.100.3...
通过ArcGISRuntime SDK .Net 加载谷歌影像的源码,大家可以参考一下。 使用的VS2015
arcgis-runtime-sdk-android-100.5 官网下载的安卓 arcgis runtime sdk
如题,ESRI官方下载的ArcGIS Runtime SDK for .NET v100.4 官方开发包(官方原版),方便没有帐号的同志们下载。开发包较大,但请勿使用迅雷下载。
arcgis runtime samples android master
arcgis runtime for wpf
Esri.ArcGISRuntime.100.5.0.nupkg Esri.ArcGISRuntime.Hydrography.100.5.0.nupkg Esri.ArcGISRuntime.UWP.100.5.0.nupkg Esri.ArcGISRuntime.WPF.100.5.0.nupkg Esri.ArcGISRuntime.Xamarin.Forms.100.5.0.nupkg
本地上传shape 压缩包,前端解析并加载至arcgis中,下载下来直接可以跑,具体的项目详情可以移步博客观看:https://blog.csdn.net/KK_bluebule/article/details/118997455
Arcgis Runtime
目前破解不是很完善,在加载本地mpk时会有提示,但是已经能用了,做为试用是非常合适的,但是想用在产品里,建议购买正版许可。 对Arcgis Runtime SDK for WPF/JAVA以及其他版本应该是通用的许可,在WPF环境下测试...
在介绍ArcGIS Runtime的时候我们说了ArcGIS Runtime很容易部署,到底怎么个容易法呢?不用安装,而且是按需部署,用到哪些类库就部署哪些类库。下面我们看以下这个部署步骤:
ArcGIS Runtime 100前生今世;ArcGIS Runtime 100功能展示;
全国矢量地图数据之ArcGis Shape 格式交通地图数据集