利用Ogr将Kml转为Shape【1】
最近在研究Kml怎么转化为Shape文件,因为客户中很多在原来采集了一部分数据都是在google Earth中,而我们的应用中特别需要这份数据,所以打算先在GE中把这份数据导出为Kml或Kmz文件,然后我们的应用系统把Kml或Kmz数据转化为Shape,再导入到系统中。
这样做优点是:导出的Shape数据能够在很多GIS平台中读取,缺点是,会丢失Kml或Kmz的符号等信息;
我们第一阶段的目标是:只解析Kml中的点、线、面,对于贴地图片什么的暂时不考虑;
在以上的目的上我们选择了GDAL作为GIS的平台,之所以选择他是因为他不需要安装直接部署就能使用(绿色),查找一些资料发现OGR可以解析Kml数据,但是我却没有找到相关的资料方法,所以索性,自己解析Kml,要解析Kml看了好些Kml的编码资料,大概找出了编码规则开始着手解析;废话少说,直接补充解析的代码:
1.KMLPlacemarker接口,包含了Kml中Placemarker下的信息
/// <summary>
/// IKMLPlacemarker
/// </summary>
public interface IKMLPlacemarker
{
#region 成员属性
/// <summary>
/// 名称
/// </summary>
string Name { set; get; }
/// <summary>
/// 描述信息
string Description { set; get; }
/// <summary>
/// 样式路径
/// </summary>
string StyleURL { set; get; }
/// <summary>
/// 图形类型
/// </summary>
enumKmlGeometryType GeometryType { set; get; }
/// <summary>
/// KMLGeometry
/// </summary>
IKMLGeometry Geometry { set; get; }
#endregion
#region 成员方法
/// <summary>
/// 初始化
/// </summary>
/// <param name="placemarkerNode">PlacemarkerNode</param>
/// <returns>是否成功</returns>
bool Initial(System.Xml.XmlNode placemarkerNode) ;
#endregion
}
2.KMLGeometry空接口,作为KMLPlacemarker的一个属性
/// <summary>
/// KMLGeometry
/// </summary>
public interface IKMLGeometry
{
}
3.KMLPoint接口 KML中点
/// <summary>
/// IKMLPoint
/// </summary>
public interface IKMLPoint
{
#region 成员属性
/// <summary>
/// 坐标信息
/// </summary>
string Coordinates { set; get; }
#endregion
#region 成员方法
/// <summary>
/// 初始化
/// </summary>
/// <param name="pointXmlNode">point节点</param>
/// <returns>是否成功</returns>
bool InitialPoint(System.Xml.XmlNode pointXmlNode);
#endregion
}
4. KMLPolyline接口 KML中线类型
/// <summary>
/// IKMLPolyLine
/// </summary>
public interface IKMLPolyline
{
#region 成员属性
/// <summary>
/// 坐标信息
/// </summary>
string Coordinates { set; get; }
#endregion
#region 成员方法
/// <summary>
/// 初始化
/// </summary>
/// <param name="polylineXmlNode">polyLine节点</param>
/// <returns>是否成功</returns>
bool InitialPolyline(System.Xml.XmlNode polylineXmlNode);
#endregion
}
5.KMLPolygon接口 Kml中的面类型(不是多面,是面)
/// <summary>
/// IKMLPolygon
/// </summary>
public interface IKMLPolygon
{
#region 成员属性
/// <summary>
/// 坐标信息-内轮廓
/// </summary>
string Coordinates_InnerBoundary { set; get; }
/// <summary>
/// 坐标信息-外轮廓
/// </summary>
string Coordinates_OuterBoundary { set; get; }
#endregion
#region 成员方法
/// <summary>
/// 初始化
/// </summary>
/// <param name="polygonXmlNode">polyLine节点</param>
/// <returns>是否成功</returns>
bool InitialPolygon(System.Xml.XmlNode polygonXmlNode);
#endregion
}
6. KMLPoint的实现
/// <summary>
/// KMLPoint
/// </summary>
public class KMLPoint : IKMLPoint, IKMLGeometry
{
#region IKMLPoint 成员
#region 成员属性
/// <summary>
/// 坐标信息
/// </summary>
public string Coordinates { set; get; }
#endregion
#region 成员方法
/// <summary>
/// 初始化
/// </summary>
/// <param name="pointXmlNode">point节点</param>
/// <returns>是否成功</returns>
public bool InitialPoint(System.Xml.XmlNode pointXmlNode)
{
System.Xml.XmlNode childNode = null;
for (int k = 0; k < pointXmlNode.ChildNodes.Count; k++)
{
childNode = pointXmlNode.ChildNodes[k];
switch (childNode.Name)
{
case "coordinates":
{
this.Coordinates = childNode.InnerText;
break;
}
default:
{
break;
}
}
}
return true;
}
#endregion
#endregion
}
7.KMLPolyline的实现
/// <summary>
/// KMLPolyline
/// </summary>
public class KMLPolyline : IKMLPolyline, IKMLGeometry
{
#region IKMLPolyline 成员
#region 成员属性
/// <summary>
/// 坐标信息
/// </summary>
public string Coordinates { set; get; }
#endregion
#region 成员方法
/// <summary>
/// 初始化
/// </summary>
/// <param name="polylineXmlNode">polyLine节点</param>
/// <returns>是否成功</returns>
public bool InitialPolyline(System.Xml.XmlNode polylineXmlNode)
{
System.Xml.XmlNode childNode = null;
for (int k = 0; k < polylineXmlNode.ChildNodes.Count; k++)
{
childNode = polylineXmlNode.ChildNodes[k];
switch (childNode.Name)
{
case "coordinates":
{
this.Coordinates = childNode.InnerText;
break;
}
default:
{
break;
}
}
}
return true;
}
#endregion
#endregion
}
8. KMLPolygon的实现
/// <summary>
/// KMLPolygon
/// </summary>
public class KMLPolygon : IKMLPolygon, IKMLGeometry
{
#region IKMLPolygon 成员
#region 成员属性
/// <summary>
/// 坐标信息-内轮廓
/// </summary>
public string Coordinates_InnerBoundary { set; get; }
/// <summary>
/// 坐标信息-外轮廓
/// </summary>
public string Coordinates_OuterBoundary { set; get; }
#endregion
#region 成员方法
/// <summary>
/// 初始化
/// </summary>
/// <param name="polygonXmlNode">polyLine节点</param>
/// <returns>是否成功</returns>
public bool InitialPolygon(System.Xml.XmlNode polygonXmlNode)
{
System.Xml.XmlNode childNode = null;
for (int i = 0; i < polygonXmlNode.ChildNodes.Count; i++)
{
childNode = polygonXmlNode.ChildNodes[i];
switch (childNode.Name)
{
case "outerBoundaryIs":
{
this.Coordinates_OuterBoundary = GetCoordinates(childNode);
break;
}
case "innerBoundaryIs":
{
this.Coordinates_InnerBoundary = GetCoordinates(childNode);
break;
}
default:
{
break;
}
}
}
return true;
}
#endregion
#endregion
#region 私有方法
/// <summary>
/// 获得轮廓线坐标集
/// </summary>
/// <param name="boundaryNode">轮廓线节点</param>
/// <returns>坐标集</returns>
private string GetCoordinates(System.Xml.XmlNode boundaryNode)
{
System.Xml.XmlNode childNodeBoundary = null;
System.Xml.XmlNode childNodeLinering = null;
for (int k = 0; k < boundaryNode.ChildNodes.Count; k++)
{
childNodeBoundary = boundaryNode.ChildNodes[k];
if(childNodeBoundary.Name!="LinearRing") continue;
for (int j = 0; j < childNodeBoundary.ChildNodes.Count; j++)
{
childNodeLinering= childNodeBoundary.ChildNodes[j];
switch (childNodeLinering.Name)
{
case "coordinates":
{
return childNodeLinering.InnerText;
}
default:
{
break;
}
}
}
}
return string.Empty; ;
}
#endregion
}
9.KmlGeometryType枚举类型
/// <summary>
/// KmlGeometry类型枚举
/// </summary>
public enum enumKmlGeometryType
{
/// <summary>
/// 未知
/// </summary>
KMLNull=0,
/// <summary>
/// 点
/// </summary>
KMLPoint=1,
/// <summary>
/// 线
/// </summary>
KMLPolyline=2,
/// <summary>
/// 面
/// </summary>
KMLPolygon=3
}
10.KMLPlacemarker的实现
/// <summary>
/// KMLPlacemarker
/// </summary>
public class KMLPlacemarker:IKMLPlacemarker
{
#region IKMLPlacemarker 成员
#region 成员属性
/// <summary>
/// 名称
/// </summary>
public string Name { set; get; }
/// <summary>
/// 描述信息
public string Description { set; get; }
/// <summary>
/// 样式路径
/// </summary>
public string StyleURL { set; get; }
/// <summary>
/// 图形类型
/// </summary>
public enumKmlGeometryType GeometryType { set; get; }
/// <summary>
/// KMLGeometry
/// </summary>
public IKMLGeometry Geometry { set; get; }
#endregion
#region 成员方法
/// <summary>
/// 初始化
/// </summary>
/// <param name="placemarkerNode">PlacemarkerNode</param>
/// <returns>是否成功</returns>
public bool Initial(System.Xml.XmlNode placemarkerNode)
{
if (placemarkerNode == null) return false;
if (placemarkerNode.ChildNodes.Count < 1) return false;
System.Xml.XmlNode childNode = null;
for (int i = 0; i < placemarkerNode.ChildNodes.Count; i++)
{
childNode = placemarkerNode.ChildNodes[i];
switch (childNode.Name)
{
case "name":
{
this.Name = childNode.InnerText;
break;
}
case "description":
{
this.Description = childNode.InnerText;
break;
}
case "styleUrl":
{
this.StyleURL = childNode.InnerText;
break;
}
case "Point":
{
this.GeometryType = enumKmlGeometryType.KMLPoint;
this.Geometry = new KMLPoint();
(this.Geometry as IKMLPoint).InitialPoint(childNode);
break;
}
case "LineString":
{
this.GeometryType = enumKmlGeometryType.KMLPolyline;
this.Geometry = new KMLPolyline();
(this.Geometry as IKMLPolyline).InitialPolyline(childNode);
break;
}
case "Polygon":
{
this.GeometryType = enumKmlGeometryType.KMLPolygon;
this.Geometry = new KMLPolygon();
(this.Geometry as IKMLPolygon).InitialPolygon(childNode);
break;
}
default:
break;
}
}
return true;
}
#endregion
#endregion
}
11.1KML解析为KMLPlacemarker的方法:(后续会补充上,这只是一部分)
/// <summary>
/// 转换KML为Shape文件
/// </summary>
/// <param name="kmlFilePath">kml文件路径</param>
/// <param name="shapeDirectoryPath">shape文件夹路径</param>
/// <returns></returns>
public bool ConvertKMLToShape(string kmlFilePath, string shapeDirectoryPath)
{
// 判断
if (string.IsNullOrEmpty(kmlFilePath)) return false;
if (string.IsNullOrEmpty(shapeDirectoryPath)) return false;
if (!System.IO.File.Exists(kmlFilePath)) return false;
if (!System.IO.Directory.Exists(shapeDirectoryPath)) { System.IO.Directory.CreateDirectory(shapeDirectoryPath); };
string kmlFileName = System.IO.Path.GetFileNameWithoutExtension(kmlFilePath);
System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();
xmlDocument.Load(kmlFilePath);
System.Xml.XmlNodeList placeMarkerNodeList = xmlDocument.GetElementsByTagName("Placemark");
System.Xml.XmlNode placeMarkerNode = null;
IList<IKMLPlacemarker> kmlPlaceMarkers_Point = new List<IKMLPlacemarker>(); ;
IList<IKMLPlacemarker> kmlPlaceMarkers_Polyline = new List<IKMLPlacemarker>(); ;
IList<IKMLPlacemarker> kmlPlaceMarkers_Polygon = new List<IKMLPlacemarker>(); ;
IKMLPlacemarker kmlPlacemarker = null;
string coordinates = string.Empty;
int i = 0;
for (i = 0; i < placeMarkerNodeList.Count; i++)
{
placeMarkerNode = placeMarkerNodeList.Item(i);
kmlPlacemarker = new KMLPlacemarker();
kmlPlacemarker.Initial(placeMarkerNode);
switch (kmlPlacemarker.GeometryType)
{
case enumKmlGeometryType.KMLPoint:
kmlPlaceMarkers_Point.Add(kmlPlacemarker);
break;
case enumKmlGeometryType.KMLPolyline:
kmlPlaceMarkers_Polyline.Add(kmlPlacemarker);
break;
case enumKmlGeometryType.KMLPolygon:
kmlPlaceMarkers_Polygon.Add(kmlPlacemarker);
break;
default:
break;
}
}
////////////////////////////////////////隐掉了部分生成Shape的代码/////////////////////////////////////////
return true;
}
这时候就能把Kml文件解析为自己定义的KmlPlacemarker,它包含了Kml中Placemarker中的所有信息;
利用Ogr将Kml转为Shape【1】的更多相关文章
- python 利用 ogr 写入shp文件,数据格式
python 利用 ogr 写入 shp 文件, 定义shp文件中的属性字段(field)的数据格式为: OFTInteger # 整型 OFTIntegerList # 整型list OFTReal ...
- .net 利用Emit将object转为DbParameter,DataTable转为List<>
先放测试结果图,测试的方法是拷贝了老赵的一个简单的性能计数器:CodeTimer.发现速度还是比利用反射来获取快了2倍左右的,将object转为DbParameter的反射方法我没写. ...
- ArcGIS中KML转为shp文件
问题:如何将KML转为shp文件? 方法: 1.打开ArcMap -> ArcToolbox: 2.在ArcToolbox中选择“转换工具”-> “由KML转出” -> “KML转图 ...
- java利用反射将pojo转为json对象
最近做以太坊钱包项目需要与前台进行json交互,写一个工具类,经普通javaBean转为json对象 package util; import java.lang.reflect.Field; imp ...
- 利用css将英文转为大写或小写
项目需要在后台接收的字段值为小写,但在页面上显示大写英文,但操作页面之后,最终传给后台的依旧是小写,所以就需要使用css转化一下即可 <li>This.is.a.book,全部转为大写:& ...
- 利用PhotoShop将Font-Awesome转为图片格式
介绍如何将Font-Awesome等字体图标转换为图片格式,使用PHOTPSHOP很简单. 网上找了很多,都比较麻烦.别问为什么要这么做,因为你还没遇到需要的时候. 下载Font-Awesome字体库 ...
- 利用itext将html转为pdf
亲测代码没有问题,需要注意细节已经标注:需要jar包:iText-2.0.8.jar:core-renderer-R8.jar: core-renderer-R8.jar下载地址:http://cen ...
- json处理三部曲之第三曲:利用Gson处理json
需要导入gson-xxx.jar包 <dependency> <groupId>com.google.code.gson</groupId> <artifac ...
- shp的基本操作
本节将介绍如何利用python完成对shp的基本操作 1.读取shp四至 import shapefile sf = shapefile.Reader(r"E:\shp\1.shp" ...
随机推荐
- C#-WebForm-组合查询(Queryable延迟查询、Intersect交集)、分页展示基础
组合查询: 方法一:Queryable<> 延迟查询 其特点是:读到词句代码时不会立即执行,而是在进行数据绑定时执行 优点:此期间可以进行添加查询条件,以减少数据库查询内容,来减少内存占用 ...
- 洛谷 P2015 二叉苹果树 (树上背包)
洛谷 P2015 二叉苹果树 (树上背包) 一道树形DP,本来因为是二叉,其实不需要用树上背包来干(其实即使是多叉也可以多叉转二叉),但是最近都刷树上背包的题,所以用了树上背包. 首先,定义状态\(d ...
- jquery中ajax使用error调试错误的方法,实例分析了Ajax的使用方法与error函数调试错误的技巧
代码:$(document).ready(function() { jQuery("#clearCac").click(function() { jQuery.ajax({ url ...
- css变量的应用
微软在2017年3月份宣布 Edge 浏览器将支持 CSS 变量,到现在已经过去一年多了,哈哈,是不是有点后知后觉? 这个知识点是在阮一峰的日志上浏览到的,在此借用一下了..跟大家分享一下..... ...
- Mac下使Iterm2开机启动不显示界面
一.在登录项上添加Iterm2的启动项 二.打开Iterm2 1.启动后会显示Iterm2,此时点击关闭按钮,保证桌面上没有任何的控制台窗口. 2.按[Command]+[Shift]+[S],保存名 ...
- 1、 小白带你入坑xamarin系列之环境搭建和准备
重点提示 由于xamarin发展更新很快 目前教程部分内容已经过时 请注意下载最新版本 2018.05.23 www.xamarin.com 1. 小白带你入坑xamarin系列之环境搭建和准备 ...
- springboot入门神器 -http://start.spring.io/(在线项目构建)
参考并直接引用:http://www.sousou.io/article/1506656459859 最近在学习spring boot,看的书是<JavaEE开发的颠覆者 Spring Boot ...
- SPSS学习系列之SPSS Statistics导入读取数据(多种格式)(图文详解)
不多说,直接上干货! SPSS Statistics导入读取数据的步骤: 文件 -> 导入数据 成功! 欢迎大家,加入我的微信公众号:大数据躺过的坑 免费给分享 同时,大 ...
- Idea查看代码相关技巧
(1)查看类中的属性与方法快捷键 Alt+7 (2)查看方法被调用 在方法上右键find usages (3)查看方法说明 Ctrl+Q
- javac之Method Invocation Expressions
15.12.1. Compile-Time Step 1: Determine Class or Interface to Search 15.12.2. Compile-Time Step 2: D ...