日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

C#打造一個開源webgis(四)地圖客戶端(中)

 鴻楓nh 2018-09-13

應(yīng)用場景

做過開發(fā)的會遇到過這樣一個情景:

1、寫了很多代碼做了一個系統(tǒng);

2、后來又要做一個類似系統(tǒng),也有了設(shè)計模式概念,就把第一個系統(tǒng)的代碼抽調(diào)出來,封裝成公用模塊或類庫,供第二個系統(tǒng)使用;

3、又有幾個類似的系統(tǒng)要做,為了減少工作效率,提煉出自己的一個框架。

說起這個,就繞回到第一節(jié)提到過地圖系統(tǒng)架構(gòu)問題,在這里主要就是地圖服務(wù)api的概念??梢韵胂笠幌?,本來做的GIS系統(tǒng)只支持桌面方式,突然說要做出WebGiS,是不是要重新開發(fā)?沒必要,我們只需做一個共有的地圖服務(wù)接口供調(diào)用,無論是給桌面程序還是瀏覽器,都可以獲得一致的效果,這也就是從B/S和C/S轉(zhuǎn)向B/S/S和C/S/S概念,中間的S就是Application Server,我們把服務(wù)api部署在這里,基于此,我們又可以做一個DEMO。

DEMO

1、在此,借用一下WCF,創(chuàng)建控制臺程序,構(gòu)建解決方案如圖,由于只是簡單演示,具體細節(jié)先不做深究:


IDomain.cs、DomainService.cs、clentaccesspolicy.xml是為了實現(xiàn)跨域,Site是數(shù)據(jù)庫里的基站信息model,ISiteService和SiteService為模擬的地圖查詢服務(wù),具體代碼為:
IDomain.cs
  1. [ServiceContract]
  2. public interface IDomain
  3. {
  4. [OperationContract]
  5. [WebGet(UriTemplate = "ClientAccessPolicy.xml")]
  6. Message ProvidePolicyFile();
  7. }
ISiteService.cs
  1. [ServiceContract]
  2. public interface ISiteService
  3. {
  4. [OperationContract]
  5. List<Site> GetSites();
  6. }
Site.cs
  1. [DataContract]
  2. public class Site
  3. {
  4. [DataMember]
  5. public string GID { get; set; }
  6. [DataMember]
  7. public string SiteName { get; set; }
  8. [DataMember]
  9. public string Geom { get; set; }
  10. }

DomainService.cs
  1. public class DomainService : IDomain
  2. {
  3. public System.ServiceModel.Channels.Message ProvidePolicyFile()
  4. {
  5. MemoryStream ms = new MemoryStream();
  6. using (FileStream fs = File.OpenRead(@"clientaccesspolicy.xml"))
  7. {
  8. int length = (int)fs.Length;
  9. byte[] data = new byte[length];
  10. fs.Position = 0;
  11. fs.Read(data, 0, length);
  12. ms = new MemoryStream(data);
  13. }
  14. XmlReader reader = XmlReader.Create(ms);
  15. Message result = Message.CreateMessage(MessageVersion.None, "", reader);
  16. return result;
  17. }
  18. }

SiteService.cs
  1. public class SiteService:ISiteService
  2. {
  3. private DataSet ds = new DataSet();
  4. private DataTable dt = new DataTable();
  5. public List<Site> GetSites()
  6. {
  7. List<Site> source = new List<Site>();
  8. try
  9. {
  10. // PostgeSQL-style connection string
  11. string connstring = String.Format("Server={0};Port={1};User Id={2};Password={3};Database={4};", "localhost", "5432", "postgres", "sa", "postgis20");
  12. // Making connection with Npgsql provider
  13. NpgsqlConnection conn = new NpgsqlConnection(connstring);
  14. conn.Open();
  15. // quite complex sql statement
  16. // data adapter making request from our connection
  17. //string sql = "SELECT * from cellcover_region";
  18. string sql = "SELECT a.* FROM public.cellcover_region as a, site_font_point as b where b.gid=1 and ST_Within(b.geom,a.geom)";
  19. NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
  20. ds.Reset();
  21. // filling DataSet with result from NpgsqlDataAdapter
  22. da.Fill(ds);
  23. // since it C# DataSet can handle multiple tables, we will select first
  24. dt = ds.Tables[0];
  25. int count = dt.Rows.Count;
  26. for (int i = 0; i < count; i++)
  27. {
  28. DataRow dr = dt.Rows[i];
  29. Site site = new Site
  30. {
  31. GID = dr[0].ToString(),
  32. SiteName = dr[1].ToString(),
  33. Geom = dr[2].ToString()
  34. };
  35. source.Add(site);
  36. }
  37. conn.Close();
  38. }
  39. catch (Exception ex)
  40. {
  41. throw ex;
  42. }
  43. return source;
  44. }
  45. }

Program.cs
  1. static void Main(string[] args)
  2. {
  3. ServiceHost host = new ServiceHost(typeof(SiteService));
  4. ServiceHost crossDomainserviceHost = new ServiceHost(typeof(DomainService));
  5. host.Opened += delegate
  6. {
  7. Console.WriteLine("服務(wù)已經(jīng)啟動,按任意鍵終止...");
  8. };
  9. crossDomainserviceHost.Opened += delegate
  10. {
  11. Console.WriteLine("跨域服務(wù)已經(jīng)啟動,按任意鍵終止...");
  12. };
  13. crossDomainserviceHost.Open();
  14. host.Open();
  15. Console.ReadKey();
  16. host.Close();
  17. host.Abort();
  18. crossDomainserviceHost.Close();
  19. crossDomainserviceHost.Abort();
  20. }


編譯運行,效果如圖,表示服務(wù)正常啟動:


下面兩點在后續(xù)節(jié)中再做詳細補充:
2、把上節(jié)做的silverlight客戶端,添加該WCF服務(wù),在交互過程中(如點擊圖元)調(diào)用服務(wù)方法,完成數(shù)據(jù)展現(xiàn)
3、wpf做地圖客戶端,添加該WCF服務(wù),在交互過程中調(diào)用服務(wù),完成地圖展現(xiàn)

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多