ArcGIS Runtime加载本地Shape数据和编辑Shape数据

长平狐 发布于 2012/11/28 15:39
阅读 3K+
收藏 1

 

问题的提出

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(objectsender, RoutedEventArgse)

        {

            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 (ShapeFileRecordpRecord in pShapeRecords)

                    {

                        GraphicpGraphic = 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.DataSourcepDS;

        OSGeo.OGR.LayerpLayer;

 

 

private void button3_Click(objectsender, RoutedEventArgse)

        {

        

 

             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.DriverpDriver = 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");

 

                    //获取几何类型

 

                    wkbGeometryTypepGeoType = pLayer.GetLayerDefn().GetGeomType();

                    // 获取空间参考

 

                    OSGeo.OSR.SpatialReferencepSpatial = pLayer.GetSpatialRef();

                }

            }

 

        }

 

//传入我们在地图上的点

        void Test(MapPoint pMapPoint)

        {

                               //创建一个Feature,一个Point

                    OSGeo.OGR.FeaturepFeature = newFeature(pLayer.GetLayerDefn());

                    OSGeo.OGR.GeometrypPointGeo = newOSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbPoint);

 

                    pPointGeo.AddPoint(pMapPoint.X,pMapPoint.Y, 0);

 

                    //字段个数,不包括ObjectIDFID

 

                    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的方法逆转过来就应该是可以的,这一步还需要花点时间整理整理。

 

 


原文链接:http://blog.csdn.net/arcgis_all/article/details/8215153
加载中
返回顶部
顶部