打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C#打造一个开源webgis(四)地图客户端(中)

应用场景

做过开发的会遇到过这样一个情景:

1、写了很多代码做了一个系统;

2、后来又要做一个类似系统,也有了设计模式概念,就把第一个系统的代码抽调出来,封装成公用模块或类库,供第二个系统使用;

3、又有几个类似的系统要做,为了减少工作效率,提炼出自己的一个框架。

说起这个,就绕回到第一节提到过地图系统架构问题,在这里主要就是地图服务api的概念。可以想象一下,本来做的GIS系统只支持桌面方式,突然说要做出WebGiS,是不是要重新开发?没必要,我们只需做一个共有的地图服务接口供调用,无论是给桌面程序还是浏览器,都可以获得一致的效果,这也就是从B/S和C/S转向B/S/S和C/S/S概念,中间的S就是Application Server,我们把服务api部署在这里,基于此,我们又可以做一个DEMO。

DEMO

1、在此,借用一下WCF,创建控制台程序,构建解决方案如图,由于只是简单演示,具体细节先不做深究:


IDomain.cs、DomainService.cs、clentaccesspolicy.xml是为了实现跨域,Site是数据库里的基站信息model,ISiteService和SiteService为模拟的地图查询服务,具体代码为:
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("服务已经启动,按任意键终止...");
  8. };
  9. crossDomainserviceHost.Opened += delegate
  10. {
  11. Console.WriteLine("跨域服务已经启动,按任意键终止...");
  12. };
  13. crossDomainserviceHost.Open();
  14. host.Open();
  15. Console.ReadKey();
  16. host.Close();
  17. host.Abort();
  18. crossDomainserviceHost.Close();
  19. crossDomainserviceHost.Abort();
  20. }


编译运行,效果如图,表示服务正常启动:


下面两点在后续节中再做详细补充:
2、把上节做的silverlight客户端,添加该WCF服务,在交互过程中(如点击图元)调用服务方法,完成数据展现
3、wpf做地图客户端,添加该WCF服务,在交互过程中调用服务,完成地图展现

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C#打造一个开源webgis(四)地图客户端
步步为营 .NET 设计模式学习笔记 六、Adapter(适配器模式) - spring yang - 博客园
WebGIS 瓦片地图—瓦片地图原理应用实战-如何实现地图切片工具
C#对MySQL的数据库操作类
4000元的面试题,
xsd文件插入dataset
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服