午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    利用GDAL/OGR導(dǎo)空間數(shù)據(jù)到SQLServer2008
    來源:易賢網(wǎng) 閱讀:1449 次 日期:2014-12-04 15:21:39
    溫馨提示:易賢網(wǎng)小編為您整理了“利用GDAL/OGR導(dǎo)空間數(shù)據(jù)到SQLServer2008”,方便廣大網(wǎng)友查閱!

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

    首先查資料,了解了一下SQLServer中的空間數(shù)據(jù)分兩種,Geometry和Geography,一種是平面一種球面,比如在做距離計(jì)算時(shí)結(jié)果是不一樣的啊

    所以我必須先Geography球面坐標(biāo)系,但這玩意兒有限制啊,比如多邊形外環(huán)方向必須是逆時(shí)針,內(nèi)環(huán)方向必須是順時(shí)針,不能超過一個(gè)半球等等

    不管了先做,加載GDAL和ORG,打開MapInfo圖層,遍歷之,取字段正常,取幾何個(gè)數(shù)正確,下一步將幾何數(shù)據(jù)導(dǎo)出,方法很多,支持OpenGIS的系統(tǒng)

    都支持WKT和WKB,為了方便選ExportToWkt,然后生成 INSERT語句,差不多了,執(zhí)行之,問題來了:Sqlserver報(bào)錯(cuò),說什么

    消息 6522,級(jí)別 16,狀態(tài) 1,第 1 行

    在執(zhí)行用戶定義例程或聚合 "geography" 期間出現(xiàn) .NET Framework 錯(cuò)誤:

    Microsoft.SqlServer.Types.GLArgumentException: 24205: 因?yàn)橹付ǖ妮斎氤^了一個(gè)半球,所以它不代表有效的地理實(shí)例。每個(gè)地理實(shí)例必須能容納在一個(gè)半球內(nèi)。此錯(cuò)誤的常見原因是某個(gè)多邊形的環(huán)方向錯(cuò)誤。

    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,沒問題可以正常生成幾何,哎,說明真的環(huán)方向有問題,改吧,于是有了以后代碼

    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

    {

    ///

    /// 判斷環(huán)的是否為順時(shí)針方向

    ///

    ///

    /// True順時(shí)針,F(xiàn)alse逆時(shí)針

    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;

    }

    //判斷是否是環(huán)

    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規(guī)則,多邊形外環(huán)應(yīng)該逆時(shí)針,內(nèi)環(huán)順時(shí)針

    //POLYGON(())中第一個(gè)()中的是外形,其它的是內(nèi)環(huán)

    //LINESTRING()直接判斷是否為逆時(shí)針即可(判斷一下需要需要逆時(shí)針)

    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 多邊形有內(nèi)環(huán)的不能逆轉(zhuǎn),要順時(shí)針

    if (IsRing(ls))

    {

    var rs = string.Join(",", Resverse(ls, IsRingClockwise(ls)));//如果是順時(shí)針則逆轉(zhuǎn)

    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是沒問題的,再次測(cè)試了一個(gè)MapInfo Table

    (中國(guó)面省界)基本OK,再導(dǎo)面縣界,結(jié)果一些搞不定,導(dǎo)出WKT用SELECT在SQLER里試了一下,真不行啊,查了一下用網(wǎng)上工具導(dǎo)的記錄,WKT是GEOMETRYCOLLECTION,而我用GDAL/OGR查出來說是POLYGON類型

    利用GDAL/OGR導(dǎo)空間數(shù)據(jù)到SQLServer2008 三聯(lián)

    名單

    這明明是一條線和一個(gè)多邊形組成的啊,GDAL/OGR居然說是POLYGON,試了GDAL1.6、GDAL1.7,應(yīng)該是OGR的問題,不搞了,累覺不愛啊

    總之導(dǎo)ESRI Shape用Geometry模式還是可以的,中文問題解決了,配和SQLServer的Update語句基本能解決問題

    更多信息請(qǐng)查看IT技術(shù)專欄

    更多信息請(qǐng)查看數(shù)據(jù)庫
    易賢網(wǎng)手機(jī)網(wǎng)站地址:利用GDAL/OGR導(dǎo)空間數(shù)據(jù)到SQLServer2008
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2025國(guó)考·省考課程試聽報(bào)名

    • 報(bào)班類型
    • 姓名
    • 手機(jī)號(hào)
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專用圖標(biāo)