c# 从MySQL往sharpmap中加载矢量数据图层(一)
最近在学习使用开源数据库和开源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中加载矢量数据图层(一)相关推荐
- Spark-SQL从MySQL中加载数据以及将数据写入到mysql中(Spark Shell方式,Spark SQL程序)
1. JDBC Spark SQL可以通过JDBC从关系型数据库中读取数据的方式创建DataFrame,通过对DataFrame一系列的计算后,还可以将数据再写回关系型数据库中. 1.1. 从MySQ ...
- spark mysql 写_Spark-SQL从MySQL中加载数据以及将数据写入到mysql中(Spark Shell方式,Spark SQL程序)...
1. JDBC Spark SQL可以通过JDBC从关系型数据库中读取数据的方式创建DataFrame,通过对DataFrame一系列的计算后,还可以将数据再写回关系型数据库中. 1.1. 从MySQ ...
- mysql_connect() 不支持 请检查 mysql 模块是否正确加载
在上面文章的基础上配置PHP环境完成之后发现安装(discuz)论坛时候还是有问题! 函数名称 检查结果 建议 mysq ...
- Flask + Ajax + Mysql 实现网页异步加载(一)
滚动条滑到底部时候,在当前页面加载下一页数据: 滚动条到达顶部时候,刷新当前页面. 一.flask 实现的服务器端 @app.route('/',methods=['GET','POST']) def ...
- 在C++中加载TorchScript模型
在C++中加载TorchScript模型 本教程已更新为可与PyTorch 1.2一起使用 顾名思义,PyTorch的主要接口是Python编程语言.尽管Python是合适于许多需要动态性和易于迭代的 ...
- xBIM 实战01 在浏览器中加载IFC模型文件
系列目录 [已更新最新开发文章,点击查看详细] 一.创建Web项目 打开VS,新建Web项目,选择 .NET Framework 4.5 选择一个空的项目 新建完成后,项目结构如下: 二.添 ...
- Spring中加载xml配置文件的六种方式
Spring中加载xml配置文件的六种方式 博客分类: Spring&EJB XMLSpringWebBeanBlog 因为目前正在从事一个项目,项目中一个需求就是所有的功能都是插件的形式装 ...
- 如何在Author中加载SDE栅格图层?
如何在Author中加载SDE栅格图层? 版本: ArcIMS 9.1 在Author中加载SDE栅格图层,并保存AXL文件. 过程描述 1.使用ArcIMS Author工具正常的连接ArcSDE ...
- 如何找出R中加载的软件包版本?
本文翻译自:How to find out which package version is loaded in R? I am in a process of figuring out how to ...
- pyharm虚拟环境_手把手教你如何在Pycharm中加载和使用虚拟环境
/1 前言/ 上次小编给大家介绍了Python虚拟环境及其使用和操作教程,没来得及上车的小伙伴,可以戳这个文章进行阅览.这篇文章基于虚拟环境的搭建,也相对比较基础,主要是介绍如何在Pycharm中加载 ...
最新文章
- python运行卡死_快速解决jupyter启动卡死的问题
- 1815. 计算两点间的距离
- [Qt教程] 第25篇 数据库(五)SQL表格模型QSqlTableModel
- c语言结构体定义字符串数组,C语言,结构体中字符串的声明(采用字符指针还是字符数组)...
- c语言什么时候需要加分号,归纳一下html中什么时候需要分号什么时候需要冒
- php 响应时间,PHP下解决ajax请求服务器响应时间过长问题
- Wireshark-ICMP数据报分析
- 安信可A9G二次开发的准备工作
- MAC hosts 文件修改流程
- php创建数组填充数组的方法
- cas4.0实现多种方式邮箱/手机号码登录及认证
- win10右键卡顿原因_Win10 右键卡顿解决办法
- 2021年Java发展怎么样?现在学了Java技术出来是否还能找到工作?
- 蓝奏云分享链接打不开的问题解决
- html p行间距离 p标签上下行间距CSS设置
- 程序员和女朋友的3种怪现象(男版)
- 计算机二级Java-综合应用题-(极速倍斩第2版-B1)
- 马化腾:我和太太也是QQ认识的
- dfs算法题目(深搜思想训练)
- 微信营销必须做,怎么做,步骤又是什么?
热门文章
- 张驰课堂:六西格玛中的Minitab软件,到底有多重要
- kafka生产者实例配置参数
- android 拼音字母语音,拼音发音点读app
- 电源纹波和电源噪声有什么区别?
- java oracle 增删改查_oracle:java直接操作oracle存储过程---增删改查
- 从阿里巴巴icon引入图标到微信小程序(可以改变大小,颜色)
- 海绵城市工程_海绵城市工程案例详解—雨水调蓄池
- Spring的配置项aspectj-autoproxy
- Facet Kernel详解、Random Walk随机游走算法详解
- 春节攻防战即将打响,想要弯道超车的商家们,准备好了吗?