最近在学习使用开源数据库和开源gis开发库来开发一个简易导航系统,选用了MySQL和sharpmap,但是将矢量图层shapefile导入MySQL之后发现sharpmap 1.1版本不支持将SQL数据直接从MySQL导入,本来想换成支持的postgreSQL,但是一同学习的其他小组否决了,于是探寻从MySQL往sharpmap加载数据的办法。

研究发现,sharpmap原本支持的方法就是通过新建一个map类的实例,然后创建一个VectorLayer类的图层,通过VectorLayer类的方法从系统路径中打开shapefile来加载进入图层中,然后把这个图层加载进入map类中,渲染map类的实例得到一个Image的变量,放在图片控件中显示出来。sharpmap还可以通过通过Extensions类,来从不同的数据源加载图层:

Extension Are Cool Cool
Oracle Oracle Spatial datasource provider Data provider Diego Guidi
PostGIS PostgreSQL/PostGIS datasource provider Data provider Volleyknaller , FObermaier
PostGIS2 PostgreSQL/PostGIS datasource provider Data provider Volleyknaller
OGR Provider Adding support for several vector formats through OGR Data Provider Volleyknaller
NetTopologySuite Data Provider Adds NTS functionality to SharpMap Data Provider Diego Guidi
GDAL Raster Layer Adding support for a vast number of raster image formats using GDAL Layer Volleyknaller, FObermaier
SimpleChart Add pie-charts as symbols to your map based on attribute data Example Volleyknaller
SpatiaLite SQLite/SpatiaLite datasource provider Data Provider Bill Dollins,Kev, FObermaier

sharpmap从14年以来就不更新了,据说项目主导者进了公司,对这项目也不上心了,以后估计我都不会用到sharpmap了。
无法从MySQL中直接导入数据,于是采用个折中的办法,从MySQL中储存的记录,构造一张新的shapefile,然后再导入sharpmap中。

上两节讲过如何将shapefile存储进入MySQL中,采用的是GDAL的OGR中的ogr2ogr类,所以想到采用开源的GDAL库来将MySQL表数据写成shapefile文件。找了很久之后没发现c#有直接调用的函数,但是找到了一篇文章例子,改一下就好了。

/******************************************************************************* $Id: createdata.cs 35222 2016-08-28 06:06:11Z goatbar $** Name:     createdata.cs* Project:  GDAL CSharp Interface* Purpose:  A sample app to create a spatial data source and a layer.* Author:   Tamas Szekeres, szekerest@gmail.com******************************************************************************** Copyright (c) 2007, Tamas Szekeres* Copyright (c) 2009-2010, Even Rouault <even dot rouault at mines-paris dot org>** Permission is hereby granted, free of charge, to any person obtaining a* copy of this software and associated documentation files (the "Software"),* to deal in the Software without restriction, including without limitation* the rights to use, copy, modify, merge, publish, distribute, sublicense,* and/or sell copies of the Software, and to permit persons to whom the* Software is furnished to do so, subject to the following conditions:** The above copyright notice and this permission notice shall be included* in all copies or substantial portions of the Software.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER* DEALINGS IN THE SOFTWARE.*****************************************************************************/using System;using OSGeo.OGR;
using OSGeo.OSR;/*** <p>Title: GDAL C# createdata example.</p>* <p>Description: A sample app to create a spatial data source and a layer.</p>* @author Tamas Szekeres (szekerest@gmail.com)* @version 1.0*//// <summary>
/// A C# based sample to create a layer.
/// </summary>
namespace 路径查询程序
{class CreateData{public static void usage(){Console.WriteLine("usage: createdata {data source name} {layername}");System.Environment.Exit(-1);}public static void Main(string[] args){if (args.Length != 2) usage();// Using early initialization of System.ConsoleConsole.WriteLine("");/* -------------------------------------------------------------------- *//*      Register format(s).                                             *//* -------------------------------------------------------------------- */Ogr.RegisterAll();/* -------------------------------------------------------------------- *//*      Get driver                                                      *//* -------------------------------------------------------------------- */Driver drv = Ogr.GetDriverByName("ESRI Shapefile");if (drv == null){Console.WriteLine("Can't get driver.");System.Environment.Exit(-1);}// TODO: drv.name is still unsafe with lazy initialization (Bug 1339)//string DriverName = drv.name;//Console.WriteLine("Using driver " + DriverName);/* -------------------------------------------------------------------- *//*      Creating the datasource                                         *//* -------------------------------------------------------------------- */DataSource ds = drv.CreateDataSource(args[0], new string[] { });if (drv == null){Console.WriteLine("Can't create the datasource.");System.Environment.Exit(-1);}/* -------------------------------------------------------------------- *//*      Creating the layer                                              *//* -------------------------------------------------------------------- */Layer layer;int i;for (i = 0; i < ds.GetLayerCount(); i++){layer = ds.GetLayerByIndex(i);if (layer != null && layer.GetLayerDefn().GetName() == args[1]){Console.WriteLine("Layer already existed. Recreating it.\n");ds.DeleteLayer(i);break;}}layer = ds.CreateLayer(args[1], null, wkbGeometryType.wkbPoint, new string[] { });if (layer == null){Console.WriteLine("Layer creation failed.");System.Environment.Exit(-1);}/* -------------------------------------------------------------------- *//*      Adding attribute fields                                         *//* -------------------------------------------------------------------- */FieldDefn fdefn = new FieldDefn("Name", FieldType.OFTString);fdefn.SetWidth(32);if (layer.CreateField(fdefn, 1) != 0){Console.WriteLine("Creating Name field failed.");System.Environment.Exit(-1);}fdefn = new FieldDefn("IntField", FieldType.OFTInteger);if (layer.CreateField(fdefn, 1) != 0){Console.WriteLine("Creating IntField field failed.");System.Environment.Exit(-1);}fdefn = new FieldDefn("DbleField", FieldType.OFTReal);if (layer.CreateField(fdefn, 1) != 0){Console.WriteLine("Creating DbleField field failed.");System.Environment.Exit(-1);}fdefn = new FieldDefn("DateField", FieldType.OFTDate);if (layer.CreateField(fdefn, 1) != 0){Console.WriteLine("Creating DateField field failed.");System.Environment.Exit(-1);}/* -------------------------------------------------------------------- *//*      Adding features                                                 *//* -------------------------------------------------------------------- */Feature feature = new Feature(layer.GetLayerDefn());feature.SetField("Name", "value");feature.SetField("IntField", (int)123);feature.SetField("DbleField", (double)12.345);feature.SetField("DateField", 2007, 3, 15, 18, 24, 30, 0);Geometry geom = Geometry.CreateFromWkt("POINT(47.0 19.2)");if (feature.SetGeometry(geom) != 0){Console.WriteLine("Failed add geometry to the feature");System.Environment.Exit(-1);}if (layer.CreateFeature(feature) != 0){Console.WriteLine("Failed to create feature in shapefile");System.Environment.Exit(-1);}ReportLayer(layer);}public static void ReportLayer(Layer layer){FeatureDefn def = layer.GetLayerDefn();Console.WriteLine("Layer name: " + def.GetName());Console.WriteLine("Feature Count: " + layer.GetFeatureCount(1));Envelope ext = new Envelope();layer.GetExtent(ext, 1);Console.WriteLine("Extent: " + ext.MinX + "," + ext.MaxX + "," +ext.MinY + "," + ext.MaxY);/* -------------------------------------------------------------------- *//*      Reading the spatial reference                                   *//* -------------------------------------------------------------------- */OSGeo.OSR.SpatialReference sr = layer.GetSpatialRef();string srs_wkt;if (sr != null){sr.ExportToPrettyWkt(out srs_wkt, 1);}elsesrs_wkt = "(unknown)";Console.WriteLine("Layer SRS WKT: " + srs_wkt);/* -------------------------------------------------------------------- *//*      Reading the fields                                              *//* -------------------------------------------------------------------- */Console.WriteLine("Field definition:");for (int iAttr = 0; iAttr < def.GetFieldCount(); iAttr++){FieldDefn fdef = def.GetFieldDefn(iAttr);Console.WriteLine(fdef.GetNameRef() + ": " +fdef.GetFieldTypeName(fdef.GetFieldType()) + " (" +fdef.GetWidth() + "." +fdef.GetPrecision() + ")");}/* -------------------------------------------------------------------- *//*      Reading the shapes                                              *//* -------------------------------------------------------------------- */Console.WriteLine("");Feature feat;while ((feat = layer.GetNextFeature()) != null){ReportFeature(feat, def);feat.Dispose();}}public static void ReportFeature(Feature feat, FeatureDefn def){Console.WriteLine("Feature(" + def.GetName() + "): " + feat.GetFID());for (int iField = 0; iField < feat.GetFieldCount(); iField++){FieldDefn fdef = def.GetFieldDefn(iField);Console.Write(fdef.GetNameRef() + " (" +fdef.GetFieldTypeName(fdef.GetFieldType()) + ") = ");if (feat.IsFieldSet(iField))Console.WriteLine(feat.GetFieldAsString(iField));elseConsole.WriteLine("(null)");}if (feat.GetStyleString() != null)Console.WriteLine("  Style = " + feat.GetStyleString());Geometry geom = feat.GetGeometryRef();if (geom != null)Console.WriteLine("  " + geom.GetGeometryName() +"(" + geom.GetGeometryType() + ")");Envelope env = new Envelope();geom.GetEnvelope(env);Console.WriteLine("   ENVELOPE: " + env.MinX + "," + env.MaxX + "," +env.MinY + "," + env.MaxY);string geom_wkt;geom.ExportToWkt(out geom_wkt);Console.WriteLine("  " + geom_wkt);Console.WriteLine("");}}
}

但是生成的shapefile文件的编码值为(87, ‘0x57’),所以如果属性表内的值有中文,会乱码。还没找到更改办法。

c# 从MySQL往sharpmap中加载矢量数据图层(一)相关推荐

  1. Spark-SQL从MySQL中加载数据以及将数据写入到mysql中(Spark Shell方式,Spark SQL程序)

    1. JDBC Spark SQL可以通过JDBC从关系型数据库中读取数据的方式创建DataFrame,通过对DataFrame一系列的计算后,还可以将数据再写回关系型数据库中. 1.1. 从MySQ ...

  2. spark mysql 写_Spark-SQL从MySQL中加载数据以及将数据写入到mysql中(Spark Shell方式,Spark SQL程序)...

    1. JDBC Spark SQL可以通过JDBC从关系型数据库中读取数据的方式创建DataFrame,通过对DataFrame一系列的计算后,还可以将数据再写回关系型数据库中. 1.1. 从MySQ ...

  3. mysql_connect() 不支持 请检查 mysql 模块是否正确加载

    在上面文章的基础上配置PHP环境完成之后发现安装(discuz)论坛时候还是有问题! 函数名称                                检查结果          建议 mysq ...

  4. Flask + Ajax + Mysql 实现网页异步加载(一)

    滚动条滑到底部时候,在当前页面加载下一页数据: 滚动条到达顶部时候,刷新当前页面. 一.flask 实现的服务器端 @app.route('/',methods=['GET','POST']) def ...

  5. 在C++中加载TorchScript模型

    在C++中加载TorchScript模型 本教程已更新为可与PyTorch 1.2一起使用 顾名思义,PyTorch的主要接口是Python编程语言.尽管Python是合适于许多需要动态性和易于迭代的 ...

  6. xBIM 实战01 在浏览器中加载IFC模型文件

    系列目录    [已更新最新开发文章,点击查看详细]  一.创建Web项目 打开VS,新建Web项目,选择 .NET Framework 4.5  选择一个空的项目 新建完成后,项目结构如下: 二.添 ...

  7. Spring中加载xml配置文件的六种方式

    Spring中加载xml配置文件的六种方式 博客分类: Spring&EJB XMLSpringWebBeanBlog  因为目前正在从事一个项目,项目中一个需求就是所有的功能都是插件的形式装 ...

  8. 如何在Author中加载SDE栅格图层?

    如何在Author中加载SDE栅格图层? 版本: ArcIMS  9.1 在Author中加载SDE栅格图层,并保存AXL文件. 过程描述 1.使用ArcIMS Author工具正常的连接ArcSDE ...

  9. 如何找出R中加载的软件包版本?

    本文翻译自:How to find out which package version is loaded in R? I am in a process of figuring out how to ...

  10. pyharm虚拟环境_手把手教你如何在Pycharm中加载和使用虚拟环境

    /1 前言/ 上次小编给大家介绍了Python虚拟环境及其使用和操作教程,没来得及上车的小伙伴,可以戳这个文章进行阅览.这篇文章基于虚拟环境的搭建,也相对比较基础,主要是介绍如何在Pycharm中加载 ...

最新文章

  1. python运行卡死_快速解决jupyter启动卡死的问题
  2. 1815. 计算两点间的距离
  3. [Qt教程] 第25篇 数据库(五)SQL表格模型QSqlTableModel
  4. c语言结构体定义字符串数组,C语言,结构体中字符串的声明(采用字符指针还是字符数组)...
  5. c语言什么时候需要加分号,归纳一下html中什么时候需要分号什么时候需要冒
  6. php 响应时间,PHP下解决ajax请求服务器响应时间过长问题
  7. Wireshark-ICMP数据报分析
  8. 安信可A9G二次开发的准备工作
  9. MAC hosts 文件修改流程
  10. php创建数组填充数组的方法
  11. cas4.0实现多种方式邮箱/手机号码登录及认证
  12. win10右键卡顿原因_Win10 右键卡顿解决办法
  13. 2021年Java发展怎么样?现在学了Java技术出来是否还能找到工作?
  14. 蓝奏云分享链接打不开的问题解决
  15. html p行间距离 p标签上下行间距CSS设置
  16. 程序员和女朋友的3种怪现象(男版)
  17. 计算机二级Java-综合应用题-(极速倍斩第2版-B1)
  18. 马化腾:我和太太也是QQ认识的
  19. dfs算法题目(深搜思想训练)
  20. 微信营销必须做,怎么做,步骤又是什么?

热门文章

  1. 张驰课堂:六西格玛中的Minitab软件,到底有多重要
  2. kafka生产者实例配置参数
  3. android 拼音字母语音,拼音发音点读app
  4. 电源纹波和电源噪声有什么区别?
  5. java oracle 增删改查_oracle:java直接操作oracle存储过程---增删改查
  6. 从阿里巴巴icon引入图标到微信小程序(可以改变大小,颜色)
  7. 海绵城市工程_海绵城市工程案例详解—雨水调蓄池
  8. Spring的配置项aspectj-autoproxy
  9. Facet Kernel详解、Random Walk随机游走算法详解
  10. 春节攻防战即将打响,想要弯道超车的商家们,准备好了吗?