KML,SHP TAB互转,GDAL
最近在接触地图数据转换的东西,从硬件kml的数据转换其他的格式,因为从没做过着东西, 先去了解kml文件格式
http://baike.baidu.com/view/400307.htm?fr=aladdin
原来是谷歌地球的一种数据格式,先大致看了写里面的标签,kml与xml文件差多,
kml数据:

longitude:经度 latitude:纬度 altitude:高度 其他的就自己去看了。
现在开始转换,在谷歌上找到一个开源的项目 里面是对地图数据的操作,GDAL
http://www.gdal.org/ogr/ogr_formats.html 参考这里。
kml->SHP
private string CreateShp(List<Placemark> list)
{ //注册Ogr库
string pszDriverName = DriverType.Shapefile;
OSGeo.OGR.Ogr.RegisterAll(); //为了支持中文路径,请添加下面这句代码
OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
// 为了支持shp属性表字段支持中文,请添加下面这句
OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", " "); //调用对Shape文件读写的Driver接口
OSGeo.OGR.Driver poDriver = OSGeo.OGR.Ogr.GetDriverByName(pszDriverName);
if (poDriver == null)
return "打开驱动失败"; //用此Driver创建Shape文件
OSGeo.OGR.DataSource poDS;
poDS = poDriver.CreateDataSource(CreateSavePath(), null);
if (poDS == null)
return "创建数据源失败"; //创建层Layer
OSGeo.OGR.Layer poLayer;
poLayer = poDS.CreateLayer(CurrentDate, null, OSGeo.OGR.wkbGeometryType.wkbPoint, null);
if (poLayer == null)
return "创建地图层失败"; //创建属性
OSGeo.OGR.FieldDefn oField = new OSGeo.OGR.FieldDefn("name", OSGeo.OGR.FieldType.OFTString);
oField.SetWidth();
OSGeo.OGR.FieldDefn oField2 = new OSGeo.OGR.FieldDefn("height", OSGeo.OGR.FieldType.OFTInteger); OSGeo.OGR.FieldDefn ofield3 = new FieldDefn("lat", FieldType.OFTInteger);
OSGeo.OGR.FieldDefn ofield4 = new FieldDefn("lng", FieldType.OFTInteger); poLayer.CreateField(oField, );
poLayer.CreateField(oField2, );
poLayer.CreateField(ofield3, );
poLayer.CreateField(ofield4, ); //创建一个Feature,一个Point
OSGeo.OGR.Feature poFeature = new Feature(poLayer.GetLayerDefn());
OSGeo.OGR.Geometry pt = new Geometry(OSGeo.OGR.wkbGeometryType.wkbPoint); foreach (Placemark item in list)
{
//属性一"名称"赋值
poFeature.SetField(, item.Name);
//属性二"高度"赋值
poFeature.SetField(, item.LookAt.altitude);
poFeature.SetField(, item.LookAt.latitude);
poFeature.SetField(, item.LookAt.longitude); //添加坐标点 x y z
pt.AddPoint(item.LookAt.longitude, item.LookAt.latitude, item.LookAt.altitude); poFeature.SetGeometry(pt);
//将带有坐标及属性的Feature要素点写入Layer中
poLayer.CreateFeature(poFeature); } //关闭文件读写
poFeature.Dispose();
poDS.Dispose(); return "转换成功";
}
SHP->mapinfo tab转换出现问题,当我的经纬度像上图一样小数位数比较多的情况,会自动截断,仔细调试都没找到解决办法,截断都是没规则的,只能继续谷歌了,╮(╯▽╰)╭。
代码如下:
public string Convert(string driverTypeName, OnAction action)
{
string msg = string.Empty;
DataSource sourceSource;
OSGeo.OGR.Driver shpDriver;
RegisterAll(driverTypeName, out sourceSource, out shpDriver);
DataSource destSource = shpDriver.CreateDataSource(Dest, new string[] {
"AUX=YES",
"STATISTICS=YES"}); //中文
int layerCount = sourceSource.GetLayerCount();
for (int i = ; i < layerCount; i++)
{
Layer layer = sourceSource.GetLayerByIndex(i);
int featureCount = layer.GetFeatureCount();
Layer destLayer = null; //深度拷贝
//Layer destLayer = destSource.CopyLayer(layer, dest, null); #region MyRegion
for (int j = ; j < featureCount; j++)
{
Feature feature = layer.GetFeature(j); if (feature != null)
{
try
{ if (destLayer == null)
{
wkbGeometryType geoType = feature.GetGeometryRef().GetGeometryType();
//创建图层
destLayer = destSource.CreateLayer(
layer.GetName(),
action(layer),
geoType,
new string[] { });
//创建字段
FeatureDefn featureDefn = layer.GetLayerDefn();
for (int k = ; k < featureDefn.GetFieldCount(); k++)
{
destLayer.CreateField(featureDefn.GetFieldDefn(k), );
}
}
//写入要素 Feature cloneFeature = feature.Clone(); // Feature newfeature = ConvetToFeature(feature); destLayer.CreateFeature(cloneFeature); // OnFeatureConvert(featureCount, EventArgs.Empty);
}
catch (Exception ex)
{
msg = "转换失败"+ex.Message;
continue;
}
}
}
#endregion //保存
destLayer.SyncToDisk();
} msg = "转换成功";
sourceSource.Dispose();
destSource.Dispose();
shpDriver.Dispose();
return msg;
}
原来是坐标系的问题,
shp的默认与tab的坐标系不一样。参考文章:http://blog.sina.com.cn/s/blog_6e51df7f0100ui7n.html
坐标系转换参考:http://wiki.woodpecker.org.cn/moin/lilin/ogr-create
终于解决。
KML,SHP TAB互转,GDAL的更多相关文章
- C#、C++用GDAL读shp文件(转载)
C#.C++用GDAL读shp文件 C#用GDAL读shp文件 (2012-08-14 17:09:45) 标签: 杂谈 分类: c#方面的总结 1.目前使用开发环境为VS2008+GDAL1.81 ...
- Android GIS开发系列-- 入门季(13)Gdal简单写个shp文件
Gdal是用来读写栅格与矢量数据的,在Gdal官网,可以下载相关的资源进行平台的编译.其实Arcgis底层也是用Gdal来读取shp文件的,那在Android中可以直接读写shp文件吗,是可以的.这里 ...
- Java 使用GDAL 读写 shapefile
读取shp文件,并把它转化为json import org.gdal.ogr.*; import org.gdal.ogr.Driver; import org.gdal.gdal.*; public ...
- shp的基本操作
本节将介绍如何利用python完成对shp的基本操作 1.读取shp四至 import shapefile sf = shapefile.Reader(r"E:\shp\1.shp" ...
- webapi_uploadfile_gdal_to_geojson_and_unzipfile
using ICSharpCode.SharpZipLib.Zip; using OSGeo.GDAL; using OSGeo.OGR; using System; using System.Col ...
- python使用游标访问数据
游标是一种数据访问对象,可用于在表中迭代一组行或者向表中插入新行.游标有三种形式:搜索.插入或更新.游标通常用于读取现有几何和写入新几何. 每种类型的游标均由对应的 ArcPy 函数(SearchCu ...
- SublimeCodeIntel代码自动补全配置
主要使用python3,所有配置以python3为例.其他语言同理.利用sublimeCodeIntel插件可以实现自动提示python3代码.跳转追踪自定义函数.查看系统函数等.功能还是相当强大的. ...
- gdal集成kml库的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 最近要读取kml文件,具体就是把kml文件当作一个矢量文件来读取.我发现gdal是支持集成kml库的.不过集成这个km ...
- GDAL集成对KML文件的支持
目录 1. 正文 1.1. 编译LibKML 1.1.1. 第三方库支持 1.1.2. 编译错误 1.2. 配置GDAL 1.3. 链接问题 2. 参考 1. 正文 GDAL可以支持将KML作为矢量文 ...
随机推荐
- 试试Linux下的ip命令,ifconfig已经过时了
linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者.使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务.ifconfig是net-tools中已被废弃使用的一个命 ...
- Web后台快速开发框架
Web后台快速开发框架 Coldairarrow 目录 目录 第1章 目录 1 第2章 简介 3 第3章 基础准备 4 3.1 开发环境要求 4 3.2 ...
- C# 菜单之递归算法
今天因为菜单的问题, 需要用到递归算法, 在此记录一下: 1.表结构如下:(这里只是展示两个比较重要的字段) ,大家应该都看明白 2.先定义一个菜单结构类. 3.实现递归. private List& ...
- 微信内分享第三方H5链接无法使用内置浏览器打开的解决方案
很多朋友在微信内想分享转发H5链接的时候都会很容易碰到H5链接在微信内无法打开或在微信内无法打开app下载页的情况.通常这种情况微信会给个提示 “已停止访问该网址” ,那么导致这个情况的因素有哪些呢, ...
- postgresql数据库中~和like和ilike的区别
~(暂且叫他波浪号吧) 和 LIKE 和 ILIKE 操作符可以模糊匹配字符串,LIKE是一般用法,ILIKE匹配时则不区分字符串的大小写,~ 波浪号则可以使用正则匹配. LIKE和 ILIKE 它 ...
- Educational Codeforces Round 62 Div. 2
突然发现上一场edu忘记写了( A:签到. #include<iostream> #include<cstdio> #include<cmath> #include ...
- 深入理解 GIL:如何写出高性能及线程安全的 Python 代码
深入理解 GIL:如何写出高性能及线程安全的 Python 代码 本文由 伯乐在线 - 郑芸 翻译.未经许可,禁止转载!英文出处:A. Jesse.欢迎加入翻译组. GIL对多线程的影响:http:/ ...
- Luogu4492 [HAOI2018]苹果树 【动态规划】
题目分析: 思路不难想,考虑三个dp状态$f,g,d$. $g[i]$表示有$i$个点的堆的数量 $d[i]$表示有$i$个点的情况下所有的方案数中点到根的距离和 $f[i]$表示要求的答案. 不难发 ...
- [洛谷P1006] 传纸条
双线程DP的常识:DP的阶段问题:多阶段决策问题 传送门:$>here<$ 题意 n*m的矩阵里,从左上角走到右下角(只能往右或往下),再从右下角走回左上角(只能往左或往上).其中不能重复 ...
- SWIG 扩展Opencv python调用C++
osx:10.12 g++ 7.1 swig 3.0.12 opencv 3.2.0 SWIG是Simplified Wrapper and Interface Generator的缩写.是Pytho ...