自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQL Server 2008空間數(shù)據(jù)應用系列八:基于Bing Maps(Silverlight)的空間數(shù)據(jù)存儲

數(shù)據(jù)庫 SQL Server
本篇將以如何在Bing Maps(Silverlight)中動態(tài)繪制多邊圖形然后將其存儲到SQL Server 2008的空間數(shù)據(jù)列中為例,詳細介紹如何實現(xiàn)自定義圖形存儲入庫的實現(xiàn)方式和原理。

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

  1. 本文示例基于Microsoft SQL Server 2008 R2調測。
  2. 具備 Transact-SQL 編程經(jīng)驗和使用 SQL Server Management Studio 的經(jīng)驗。
  3. 具有使用 Microsoft Visual Studio 進行 Microsoft .NET Framework開發(fā)的經(jīng)驗。
  4. 具有使用WCF、Silverlight、ADO.NET開發(fā)的經(jīng)驗。
  5. 熟悉或了解Microsoft SQL Server 2008中的空間數(shù)據(jù)類型。
  6. 具備相應(比如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ù)列。

  1. CREATE TABLE [dbo].[DrawnPolygons](  
  2.     [ID] [int] IDENTITY(1,1) NOT NULL,  
  3.     [Name] [varchar](50) NOT NULL,  
  4.     [Polygon] [geography] NOT NULL)  
  5. 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ù)的入庫存儲。

  1. SET ANSI_NULLS ON 
  2. GO  
  3. SET QUOTED_IDENTIFIER ON 
  4. GO  
  5. CREATE PROCEDURE [dbo].[SavePolygon]  
  6.     (  
  7.     @name varchar(50),  
  8.     @polytext varchar(max),  
  9.     @identity int OUTPUT 
  10.     )  
  11. AS 
  12.     INSERT INTO    dbo.DrawnPolygons  
  13.                 (Name,Polygon)   
  14.     VALUES        (@name, geography::STPolyFromText(@polytext, 4326))  
  15.     SET @identity = @@Identity  
  16.       
  17.     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ù)庫存儲過程的調用。

  1. [Function(Name = "dbo.SavePolygon")]  
  2. public int SavePolygon([Parameter(DbType = "VarChar(50)")] string name,   
  3.                     [Parameter(DbType = "VarChar(MAX)")] string polygontext,   
  4.                     [Parameter(DbType = "Int")] ref System.Nullable<int> identity)  
  5. {  
  6.     IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), name, polygontext, identity);  
  7.     identity = ((System.Nullable<int>)(result.GetParameterValue(2)));  
  8.     return ((int)(result.ReturnValue));  
如上實現(xiàn)了Linq To Sql對存儲過程的調用,接下來就是創(chuàng)建WCF服務提供給Silverlight調用。
  1. [ServiceContract]  
  2. public interface IDrawService  
  3. {  
  4.     ///   
  5.     /// 保存多邊形對象到空間數(shù)據(jù)庫  
  6.     ///   
  7.     /// name="name">  
  8.     /// name="arrayOfLatLong">  
  9.     /// <returns>returns>  
  10.     [OperationContract]  
  11.     int? SavePolygon(string name, List arrayOfLatLong);  
在WCF服務的詳細實現(xiàn)中將Bing Maps客戶端傳遞過來的參數(shù)構造為空間數(shù)據(jù)類型的WKT文本格式,通過上面的存儲過程就可以直接將WKT轉化為空間數(shù)據(jù)類型直接入庫。
  1. public class DrawService : IDrawService  
  2. {  
  3.     public int? SavePolygon(string name, List arrayOfLatLong)  
  4.     {  
  5.         var sb = new StringBuilder();  
  6.         sb.Append("POLYGON ((");  
  7.  
  8.         for (var i = arrayOfLatLong.Count; i >= 1; i--)  
  9.         {  
  10.             var j = i - 1;  
  11.             sb.Append(arrayOfLatLong[j].Longitude.ToString());  
  12.             sb.Append(" ");  
  13.             sb.Append(arrayOfLatLong[j].Latitude.ToString());  
  14.             sb.Append(",");  
  15.         }  
  16.  
  17.         sb.Remove(sb.Length - 1, 1);  
  18.         sb.Append("))");  
  19.  
  20.         int? identity = 0;  
  21.  
  22.         var connectionString = ConfigurationManager.ConnectionStrings["Sql08ConnectionString"].ConnectionString;  
  23.         BMPTSDataContext ctx = new BMPTSDataContext(connectionString);  
  24.         ctx.SavePolygon("西南大區(qū)", sb.ToString(), ref identity);  
  25.  
  26.         return identity;  
  27.     }  
接口中使用的數(shù)據(jù)傳輸對象MapPoint的詳細定義如下代碼塊:
  1. ///   
  2. /// 地圖坐標點(經(jīng)度,緯度)  
  3. ///   
  4. [DataContract]  
  5. public class MapPoint  
  6. {  
  7.     [DataMember]  
  8.     public double Latitude { get; set; }  
  9.     [DataMember]  
  10.     public double Longitude { get; set; }  
  11.  
  12.     public MapPoint() { }  
  13.     public MapPoint(double lat, double lng)  
  14.     {  
  15.         this.Latitude = lat;  
  16.         this.Longitude = lng;  
  17.     }  
四、Bing Maps客戶端的實現(xiàn)

客戶端的實現(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)。

  1. private void btnSave_Click(object sender, RoutedEventArgs e)  
  2. {  
  3.     LocationCollection lc = this._drawLine.Locations;  
  4.  
  5.     ObservableCollection polygon = new ObservableCollection();  
  6.     for (int i = 0; i < lc.Count; i++)  
  7.     {  
  8.         polygon.Add(new MapPoint { Longitude = lc[i].Longitude, Latitude = lc[i].Latitude });  
  9.     }  
  10.  
  11.     //調用WCF接口實現(xiàn)數(shù)據(jù)入庫  
  12.     DrawServiceClient client = new DrawServiceClient();  
  13.     client.SavePolygonAsync(this.tbName.Text.Trim(), polygon);  
  14.     client.SavePolygonCompleted += client_SavePolygonCompleted;  
  15. }  
  16.  
  17. private void client_SavePolygonCompleted(object sender, SavePolygonCompletedEventArgs e)  
  18. {  
  19.     if (e.Error != null)  
  20.     {  
  21.         this.tbResult.Text = e.Result.Value > 0 ? "保存成功!" : "保存失敗";  
  22.     }  
五、數(shù)據(jù)庫中的空間數(shù)據(jù)

當通過Bing Maps中動態(tài)繪制多邊形圖形對象,然后將圖形數(shù)據(jù)通過WCF服務接口入庫保存后,可以通過SQL Server Management Studio查詢并在空間數(shù)據(jù)結果中直接預覽結果。

  1. 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

【編輯推薦】

  1. 日志真沒想象的那么簡單
  2. 用SQL查詢?nèi)?月 周 季
  3. SQL Server 2008中的代碼安全
  4. SQL問題與解答:維護日志和索引
  5. SQL Servr 2008空間數(shù)據(jù)應用系列七:基于Bing Maps(Silverlight) 的空間數(shù)據(jù)展現(xiàn)

 

責任編輯:艾婧 來源: 博客園
相關推薦

2011-03-22 10:20:18

Bing MapsSQL Server

2011-02-21 13:06:42

Microsoft S

2011-03-22 09:17:12

SQLCRLSQL Server

2011-02-21 13:41:14

SQL Server

2011-02-21 10:26:53

Microsoft S

2011-02-21 10:47:44

Microsoft S

2009-04-16 17:55:55

SQL Server 空間數(shù)據(jù).NET

2011-02-21 13:23:54

微軟 SQL Serv

2011-09-01 13:24:42

SQL Server 呈現(xiàn)GeoRSS訂閱的Bing Maps

2009-08-28 11:38:15

MapPoint

2011-03-22 15:36:44

Spatial TooSQL Server

2011-02-21 13:06:34

SQL Servr 2

2009-01-20 13:39:56

數(shù)據(jù)挖掘空間數(shù)據(jù)方法

2009-04-16 17:38:24

SQL Server 空間數(shù)據(jù)智能

2010-09-07 16:28:58

DB2 空間數(shù)據(jù)

2022-03-30 09:30:00

數(shù)據(jù)庫地理空間查詢SQL

2022-09-14 11:27:19

物聯(lián)網(wǎng)大數(shù)據(jù)智慧城市

2024-10-18 17:03:16

Python地理空間數(shù)據(jù)處理

2010-05-07 12:35:05

Oracle spat

2011-08-09 18:40:21

Oracle控制文件重做日志文件
點贊
收藏

51CTO技術棧公眾號