热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

利用GDAL/OGR导空间数据到SQLServer2008

网上有个工具可以做到,可惜导入的中文是乱码,搜索了一圈好像没什么解决办法,于是想自己搞一个,哎,一搞才知道麻烦重重啊~首先查资料,了解了一下SQLServer中的空间数据分两种,Geometry和Geography,一种是平面一种球面,比如在做距离计算时结果是不一

网上有个工具可以做到,可惜导入的中文是乱码,搜索了一圈好像没什么解决办法,于是想自己搞一个,哎,一搞才知道麻烦重重啊~ 首先查资料,了解了一下SQLServer中的空间数据分两种,Geometry和Geography,一种是平面一种球面,比如在做距离计算时结果是不一

  网上有个工具可以做到,可惜导入的中文是乱码,搜索了一圈好像没什么解决办法,于是想自己搞一个,哎,一搞才知道麻烦重重啊~

  首先查资料,了解了一下SQLServer中的空间数据分两种,Geometry和Geography,一种是平面一种球面,比如在做距离计算时结果是不一样的啊

  所以我必须先Geography球面坐标系,但这玩意儿有限制啊,比如多边形外环方向必须是逆时针,内环方向必须是顺时针,不能超过一个半球等等

  不管了先做,加载GDAL和ORG,打开MapInfo图层,遍历之,取字段正常,取几何个数正确,下一步将几何数据导出,方法很多,支持OpenGIS的系统

  都支持WKT和WKB,,为了方便选ExportToWkt,然后生成 INSERT语句,差不多了,执行之,问题来了:Sqlserver报错,说什么

  消息 6522,级别 16,状态 1,第 1 行

  在执行用户定义例程或聚合 "geography" 期间出现 .NET Framework 错误:

  Microsoft.SqlServer.Types.GLArgumentException: 24205: 因为指定的输入超过了一个半球,所以它不代表有效的地理实例。每个地理实例必须能容纳在一个半球内。此错误的常见原因是某个多边形的环方向错误。

  Microsoft.SqlServer.Types.GLArgumentException:

  在 Microsoft.SqlServer.Types.GLNativeMethods.ThrowExceptionForHr(GL_HResult errorCode)

  在 Microsoft.SqlServer.Types.GLNativeMethods.GeodeticIsValid(GeoData g)

  在 Microsoft.SqlServer.Types.SqlGeography.IsValidExpensive()

  在 Microsoft.SqlServer.Types.SqlGeography.ConstructGeographyFromUserInput(GeoData g, Int32 srid)

  在 Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType type, SqlChars taggedText, Int32 srid)

  在 Microsoft.SqlServer.Types.SqlGeography.STGeomFromText(SqlChars geometryTaggedText, Int32 srid)

  将geography::STGeomFromText换成geometry::STGeomFromText,没问题可以正常生成几何,哎,说明真的环方向有问题,改吧,于是有了以后代码

  using System;

  using System.Collections.Generic;

  using System.Text.RegularExpressions;

  namespace SqlSpatialTools

  {

  public class Point

  {

  public double X { get; set; }

  public double Y { get; set; }

  public Point(double x, double y)

  {

  X = x;

  Y = y;

  }

  public static Point Parse(string pt)

  {

  var p = pt.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);

  return p.Length == 2 ? new Point(Convert.ToDouble(p[0]), Convert.ToDouble(p[1])) : null;

  }

  public override string ToString()

  {

  return string.Format("{0:F8} {1:F8}", X, Y);

  }

  }

  public static class Wkt

  {

  ///

  /// 判断环的是否为顺时针方向

  ///

  ///

  /// True顺时针,False逆时针

  private static bool IsRingClockwise(IList pp)

  {

  double t = 0;

  for (var i = 1; i

  t += pp[i - 1].X * pp[i].Y - pp[i].X * pp[i - 1].Y;

  t += pp[pp.Count - 1].X * pp[0].Y - pp[0].X * pp[pp.Count - 1].Y;

  return t <0;

  }

  //判断是否是环

  public static bool IsRing(IList pp)

  {

  var t = pp.Count - 1;

  return (t > 2 && pp[0].X == pp[t].X && pp[0].Y == pp[t].Y);

  }

  public static string[] Resverse(List pts, bool resverse)

  {

  var sl = new List();

  foreach (var pt in pts)

  {

  sl.Add(pt.ToString());

  }

  if (resverse)

  sl.Reverse();

  return sl.ToArray();

  }

  public static string ReverseWKT(string wkt)

  {

  if (!Regex.IsMatch(wkt, "POLYGON"))

  return wkt;

  var retwkt = wkt;

  var ms = Regex.Matches(retwkt, @"(d+.*?d+)");

  //按geography规则,多边形外环应该逆时针,内环顺时针

  //POLYGON(())中第一个()中的是外形,其它的是内环

  //LINESTRING()直接判断是否为逆时针即可(判断一下需要需要逆时针)

  if (ms.Count > 0)

  {

  for (var i = ms.Count - 1; i >= 0; i--)

  {

  var m = ms[i];

  var s = m.ToString().TrimStart(new[] { '(' }).TrimEnd(new[] { ')' });

  var pa = s.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);

  var ls = new List();

  foreach (var p in pa)

  {

  var pt = Point.Parse(p);

  if (pt != null)

  ls.Add(pt);

  }

  //TODO 多边形有内环的不能逆转,要顺时针

  if (IsRing(ls))

  {

  var rs = string.Join(",", Resverse(ls, IsRingClockwise(ls)));//如果是顺时针则逆转

  retwkt = retwkt.Remove(m.Index, m.Length).Insert(m.Index, string.Format("({0})", rs));

  }

  }

  return retwkt;

  }

  return wkt;

  }

  }

  }

  以上用的.net 2.0所以string[].ToArray这种都不支持,虽然MutiPolygon和GeomertyCollection还是搞不定, 不过一般Polygon是没问题的,再次测试了一个MapInfo Table

  (中国面省界)基本OK,再导面县界,结果一些搞不定,导出WKT用SELECT在SQLER里试了一下,真不行啊,查了一下用网上工具导的记录,WKT是GEOMETRYCOLLECTION,而我用GDAL/OGR查出来说是POLYGON类型

利用GDAL/OGR导空间数据到SQLServer2008 三联

  这明明是一条线和一个多边形组成的啊,GDAL/OGR居然说是POLYGON,试了GDAL1.6、GDAL1.7,应该是OGR的问题,不搞了,累觉不爱啊

  总之导ESRI Shape用Geometry模式还是可以的,中文问题解决了,配和SQLServer的Update语句基本能解决问题

推荐阅读
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Echarts图表重复加载、axis重复多次请求问题解决记录
    文章目录1.需求描述2.问题描述正常状态:问题状态:3.解决方法1.需求描述使用Echats实现了一个中国地图:通过选择查询周期&#x ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • Python字典推导式及循环列表生成字典方法
    本文介绍了Python中使用字典推导式和循环列表生成字典的方法,包括通过循环列表生成相应的字典,并给出了执行结果。详细讲解了代码实现过程。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
author-avatar
大约在冬季1122_867
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有