国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 建站經驗 > 正文

利用GDAL/OGR 導空間數據到SQLServer2008

2019-11-02 15:08:07
字體:
來源:轉載
供稿:網友

   網上有個工具可以做到,可惜導入的中文是亂碼,搜索了一圈好像沒什么解決辦法,于是想自己搞一個,哎,一搞才知道麻煩重重啊~

  首先查資料,了解了一下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 < pp.Count; 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;

  }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江山市| 阿荣旗| 富阳市| 临猗县| 井陉县| 贵州省| 济源市| 天峨县| 山丹县| 梁河县| 商水县| 承德县| 台前县| 安乡县| 泸溪县| 昌图县| 安泽县| 合江县| 嘉兴市| 疏附县| 汉沽区| 萨嘎县| 潢川县| 阿瓦提县| 威宁| 通州市| 井研县| 沙雅县| 阿巴嘎旗| 连平县| 江西省| 荔波县| 博湖县| 台东市| 临汾市| 台州市| 庆云县| 平罗县| 安阳县| 岫岩| 海原县|