SQL Server 2008空間數(shù)據(jù)應用系列八:基于Bing Maps(Silverlight)的空間數(shù)據(jù)存儲
友情提示,您閱讀本篇博文的先決條件如下:
- 本文示例基于Microsoft SQL Server 2008 R2調測。
- 具備 Transact-SQL 編程經(jīng)驗和使用 SQL Server Management Studio 的經(jīng)驗。
- 具有使用 Microsoft Visual Studio 進行 Microsoft .NET Framework開發(fā)的經(jīng)驗。
- 具有使用WCF、Silverlight、ADO.NET開發(fā)的經(jīng)驗。
- 熟悉或了解Microsoft SQL Server 2008中的空間數(shù)據(jù)類型。
- 具備相應(比如OGC)的GIS專業(yè)理論知識。
在《SQL Servr 2008空間數(shù)據(jù)應用系列七:基于Bing Maps(Silverlight) 的空間數(shù)據(jù)展現(xiàn)》一文中介紹了如何基于Bing Maps呈現(xiàn)SQL Server 2008中存儲的空間數(shù)據(jù),對于標準的地理空間數(shù)據(jù)可以通過數(shù)據(jù)導入的方式將其存放到數(shù)據(jù)庫中(后續(xù)文章將詳細介紹),對于一些非標準的空間數(shù)據(jù)或者說是一個軟件產(chǎn)品中的業(yè)務空間數(shù)據(jù),則需要通過人為或其他方式將其存儲進數(shù)據(jù)庫,本篇將以如何在Bing Maps(Silverlight)中動態(tài)繪制多邊圖形然后將其存儲到SQL Server 2008的空間數(shù)據(jù)列中為例,詳細介紹如何實現(xiàn)自定義圖形存儲入庫的實現(xiàn)方式和原理。
一、創(chuàng)建空間數(shù)據(jù)表
首先創(chuàng)建空間數(shù)據(jù)類型字段表,以存儲在Bing Maps(Silverlight)中動態(tài)繪制的多邊形圖形數(shù)據(jù)到空間數(shù)據(jù)列。
- 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的空間數(shù)據(jù)類型,前臺只能通過字符串或者對象的形式將數(shù)據(jù)傳遞到后臺服務端,然后通過調用存儲過程,在存儲過程中對空間數(shù)據(jù)的字符串進行空間數(shù)據(jù)對象轉換,然后入庫。針對上面所創(chuàng)建的空間數(shù)據(jù)表可以創(chuàng)建如下存儲過程來實現(xiàn)多邊形空間數(shù)據(jù)的入庫存儲。
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- 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作為數(shù)據(jù)操作接口技術,Linq To Sql做數(shù)據(jù)訪問,自定義方法調用存儲過程實現(xiàn)數(shù)據(jù)庫入庫操作。
在項目中添加Linq To Sql文件,然后打開對于的代碼隱藏文件,在Linq To Sql自動生產(chǎn)的創(chuàng)建數(shù)據(jù)庫連接的代碼下面添加如下自定義方法實現(xiàn)數(shù)據(jù)庫存儲過程的調用。
- [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));
- }
- [ServiceContract]
- public interface IDrawService
- {
- ///
- /// 保存多邊形對象到空間數(shù)據(jù)庫
- ///
- /// name="name">
- /// name="arrayOfLatLong">
- /// <returns>returns>
- [OperationContract]
- int? SavePolygon(string name, List
arrayOfLatLong); - }
- public class DrawService : IDrawService
- {
- public int? SavePolygon(string name, List
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("西南大區(qū)", sb.ToString(), ref identity);
- return identity;
- }
- }
- ///
- /// 地圖坐標點(經(jīng)度,緯度)
- ///
- [DataContract]
- public class MapPoint
- {
- [DataMember]
- public double Latitude { get; set; }
- [DataMember]
- public double Longitude { get; set; }
- public MapPoint() { }
- public MapPoint(double lat, double lng)
- {
- this.Latitude = lat;
- this.Longitude = lng;
- }
- }
客戶端的實現(xiàn)非常簡單,首先創(chuàng)建Silverlight應用程序并添加Bing Maps Silverlight Control開發(fā)組件的引用,其次在界面中添加Map對象以顯示Bing Maps原型界面,最后可以設計一個小的工具面板,以按鈕的方式驅動觸發(fā)繪制多邊形的行為,以及保存圖形到數(shù)據(jù)庫的命令請求。如下界面效果:
對于繪制多邊形的算法這里鑒于篇幅限制就不一一貼出來了,詳細可通過文末提供的代碼下載鏈接下載本文的示例代碼。比如限制繪制一個【成都-重慶-貴陽-昆明】這四個城市組成的西南大區(qū)多變型圖形,并將其圖形數(shù)據(jù)以空間數(shù)據(jù)的形式存儲到SQL Server 2008中。圖形如下圖所示:
通過點擊“保存數(shù)據(jù)”按鈕則將地圖界面繪制的圖形數(shù)據(jù)取出來構造為數(shù)組傳遞到WCF服務接口,調用數(shù)據(jù)庫存儲過程實現(xiàn)數(shù)據(jù)入庫操作,下面是保存按鈕的代碼實現(xiàn)。
- private void btnSave_Click(object sender, RoutedEventArgs e)
- {
- LocationCollection lc = this._drawLine.Locations;
- ObservableCollection
polygon = new ObservableCollection (); - for (int i = 0; i < lc.Count; i++)
- {
- polygon.Add(new MapPoint { Longitude = lc[i].Longitude, Latitude = lc[i].Latitude });
- }
- //調用WCF接口實現(xiàn)數(shù)據(jù)入庫
- 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中動態(tài)繪制多邊形圖形對象,然后將圖形數(shù)據(jù)通過WCF服務接口入庫保存后,可以通過SQL Server Management Studio查詢并在空間數(shù)據(jù)結果中直接預覽結果。
- SELECT [ID],[Name],[Polygon] FROM [dbo].[DrawnPolygons]
六、相關資料
[1]、Geography數(shù)據(jù)類型:http://msdn.microsoft.com/zh-cn/library/cc280766.aspx
[2]、地域實例上的OGC方法:http://msdn.microsoft.com/zh-cn/library/bb933917.aspx
[3]、地理實例上的擴展方法:http://msdn.microsoft.com/zh-cn/library/bb933968.aspx
[4]、OGC靜態(tài)地理方法:http://msdn.microsoft.com/zh-cn/library/bb933988.aspx
[5]、擴展靜態(tài)地理方法:http://msdn.microsoft.com/zh-cn/library/bb933921.aspx
原文鏈接:http://www.cnblogs.com/beniao/archive/2011/03/20/1989724.html
【編輯推薦】
- 日志真沒想象的那么簡單
- 用SQL查詢?nèi)?月 周 季
- SQL Server 2008中的代碼安全
- SQL問題與解答:維護日志和索引
- SQL Servr 2008空間數(shù)據(jù)應用系列七:基于Bing Maps(Silverlight) 的空間數(shù)據(jù)展現(xiàn)