天天看點

SQL Server 2008空間資料應用系列八:基于Bing Maps(Silverlight)的空間資料存儲

友情提示,您閱讀本篇博文的先決條件如下:

  1、本文示例基于Microsoft SQL Server 2008 R2調測。

  2、具備 Transact-SQL 程式設計經驗和使用 SQL Server Management Studio 的經驗。

  3、具有使用 Microsoft Visual Studio 進行 Microsoft .NET Framework開發的經驗。

  4、具有使用WCF、Silverlight、ADO.NET開發的經驗。

  5、熟悉或了解Microsoft SQL Server 2008中的空間資料類型。

  6、具備相應(比如OGC)的GIS專業理論知識。

 

一、建立空間資料表

  首先建立空間資料類型字段表,以存儲在Bing Maps(Silverlight)中動态繪制的多邊形圖形資料到空間資料列。

CREATE TABLE [dbo].[DrawnPolygons](

    [ID] [int] IDENTITY(1,1) NOT NULL,

    [Name] [varchar](50) NOT NULL,

    [Polygon] [geography] NOT NULL)

GO

二、編寫入庫存儲過程

  目前Linq To Sql和ASP.NET Entity Framework都不支援SQL Server 2008的空間資料類型,前台隻能通過字元串或者對象的形式将資料傳遞到背景服務端,然後通過調用存儲過程,在存儲過程中對空間資料的字元串進行空間資料對象轉換,然後入庫。針對上面所建立的空間資料表可以建立如下存儲過程來實作多邊形空間資料的入庫存儲。

SET ANSI_NULLS ON

SET QUOTED_IDENTIFIER ON

CREATE PROCEDURE [dbo].[SavePolygon]

    (

    @name varchar(50),

    @polytext varchar(max),

    @identity int OUTPUT

    )

AS

    INSERT INTO    dbo.DrawnPolygons

                (Name,Polygon) 

    VALUES        (@name, geography::STPolyFromText(@polytext, 4326))

    SET @identity = @@Identity

    RETURN

三、編寫服務接口

  入庫接口可以采用WebService或者WCF技術提供,本篇采用WCF作為資料操作接口技術,Linq To Sql做資料通路,自定義方法調用存儲過程實作資料庫入庫操作。

  在項目中添加Linq To Sql檔案,然後打開對于的代碼隐藏檔案,在Linq To Sql自動生産的建立資料庫連接配接的代碼下面添加如下自定義方法實作資料庫存儲過程的調用。

[Function(Name = "dbo.SavePolygon")]

public int SavePolygon([Parameter(DbType = "VarChar(50)")] string name, 

                    [Parameter(DbType = "VarChar(MAX)")] string polygontext, 

                    [Parameter(DbType = "Int")] ref System.Nullable<int> identity)

{

    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), name, polygontext, identity);

    identity = ((System.Nullable<int>)(result.GetParameterValue(2)));

    return ((int)(result.ReturnValue));

}

  如上實作了Linq To Sql對存儲過程的調用,接下來就是建立WCF服務提供給Silverlight調用。

[ServiceContract]

public interface IDrawService

    /// <summary>

    /// 儲存多邊形對象到空間資料庫

    /// </summary>

    /// <param name="name"></param>

    /// <param name="arrayOfLatLong"></param>

    /// <returns></returns>

    [OperationContract]

    int? SavePolygon(string name, List<MapPoint> arrayOfLatLong);

  在WCF服務的詳細實作中将Bing Maps用戶端傳遞過來的參數構造為空間資料類型的WKT文本格式,通過上面的存儲過程就可以直接将WKT轉化為空間資料類型直接入庫。

public class DrawService : IDrawService

    public int? SavePolygon(string name, List<MapPoint> arrayOfLatLong)

    {

        var sb = new StringBuilder();

        sb.Append("POLYGON ((");

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

        {

            var j = i - 1;

            sb.Append(arrayOfLatLong[j].Longitude.ToString());

            sb.Append(" ");

            sb.Append(arrayOfLatLong[j].Latitude.ToString());

            sb.Append(",");

        }

        sb.Remove(sb.Length - 1, 1);

        sb.Append("))");

        int? identity = 0;

        var connectionString = ConfigurationManager.ConnectionStrings["Sql08ConnectionString"].ConnectionString;

        BMPTSDataContext ctx = new BMPTSDataContext(connectionString);

        ctx.SavePolygon("西南大區", sb.ToString(), ref identity);

        return identity;

    }

  接口中使用的資料傳輸對象MapPoint的詳細定義如下代碼塊:

/// <summary>

/// 地圖坐标點(經度,緯度)

/// </summary>

[DataContract]

public class MapPoint

    [DataMember]

    public double Latitude { get; set; }

    public double Longitude { get; set; }

    public MapPoint() { }

    public MapPoint(double lat, double lng)

        this.Latitude = lat;

        this.Longitude = lng;

四、Bing Maps用戶端的實作

  用戶端的實作非常簡單,首先建立Silverlight應用程式并添加Bing Maps Silverlight Control開發元件的引用,其次在界面中添加Map對象以顯示Bing Maps原型界面,最後可以設計一個小的工具面闆,以按鈕的方式驅動觸發繪制多邊形的行為,以及儲存圖形到資料庫的指令請求。如下界面效果:  

        

SQL Server 2008空間資料應用系列八:基于Bing Maps(Silverlight)的空間資料存儲

  對于繪制多邊形的算法這裡鑒于篇幅限制就不一一貼出來了,詳細可通過文末提供的代碼下載下傳連結下載下傳本文的示例代碼。比如限制繪制一個【成都-重慶-貴陽-昆明】這四個城市組成的西南大區多變型圖形,并将其圖形資料以空間資料的形式存儲到SQL Server 2008中。圖形如下圖所示:

SQL Server 2008空間資料應用系列八:基于Bing Maps(Silverlight)的空間資料存儲

  通過點選“儲存資料”按鈕則将地圖界面繪制的圖形資料取出來構造為數組傳遞到WCF服務接口,調用資料庫存儲過程實作資料入庫操作,下面是儲存按鈕的代碼實作。

private void btnSave_Click(object sender, RoutedEventArgs e)

    LocationCollection lc = this._drawLine.Locations;

    ObservableCollection<MapPoint> polygon = new ObservableCollection<MapPoint>();

    for (int i = 0; i < lc.Count; i++)

        polygon.Add(new MapPoint { Longitude = lc[i].Longitude, Latitude = lc[i].Latitude });

    //調用WCF接口實作資料入庫

    DrawServiceClient client = new DrawServiceClient();

    client.SavePolygonAsync(this.tbName.Text.Trim(), polygon);

    client.SavePolygonCompleted += client_SavePolygonCompleted;

private void client_SavePolygonCompleted(object sender, SavePolygonCompletedEventArgs e)

    if (e.Error != null)

        this.tbResult.Text = e.Result.Value > 0 ? "儲存成功!" : "儲存失敗";

五、資料庫中的空間資料

  當通過Bing Maps中動态繪制多邊形圖形對象,然後将圖形資料通過WCF服務接口入庫儲存後,可以通過SQL Server Management Studio查詢并在空間資料結果中直接預覽結果。

SELECT [ID],[Name],[Polygon] FROM [dbo].[DrawnPolygons]

SQL Server 2008空間資料應用系列八:基于Bing Maps(Silverlight)的空間資料存儲

六、相關資料

七、示例代碼下載下傳

SQL Server 2008空間資料應用系列八:基于Bing Maps(Silverlight)的空間資料存儲

版權說明

  本文屬原創文章,歡迎轉載且注明文章出處,其版權歸作者和部落格園共有。為了儲存作者的創作熱情,請在轉載後的明顯位置标記本文出處。  

  作      者:Beniao

SQL Server 2008空間資料應用系列八:基于Bing Maps(Silverlight)的空間資料存儲