应用场景

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

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
  [ServiceContract]public interface IDomain{[OperationContract][WebGet(UriTemplate = "ClientAccessPolicy.xml")]Message ProvidePolicyFile();}
ISiteService.cs
  [ServiceContract]public interface ISiteService{[OperationContract]List<Site> GetSites();}

Site.cs

  [DataContract]public class Site{[DataMember]public string GID { get; set; }[DataMember]public string SiteName { get; set; }[DataMember]public string Geom { get; set; }}

DomainService.cs

  public class DomainService : IDomain{public System.ServiceModel.Channels.Message ProvidePolicyFile(){MemoryStream ms = new MemoryStream();using (FileStream fs = File.OpenRead(@"clientaccesspolicy.xml")){int length = (int)fs.Length;byte[] data = new byte[length];fs.Position = 0;fs.Read(data, 0, length);ms = new MemoryStream(data);}XmlReader reader = XmlReader.Create(ms);Message result = Message.CreateMessage(MessageVersion.None, "", reader);return result;}}

SiteService.cs

 public class SiteService:ISiteService{private DataSet ds = new DataSet();private DataTable dt = new DataTable();public List<Site> GetSites(){List<Site> source = new List<Site>();try{// PostgeSQL-style connection string        string connstring = String.Format("Server={0};Port={1};User Id={2};Password={3};Database={4};", "localhost", "5432", "postgres", "sa", "postgis20");// Making connection with Npgsql provider           NpgsqlConnection conn = new NpgsqlConnection(connstring);conn.Open();// quite complex sql statement                  // data adapter making request from our connection//string sql = "SELECT * from cellcover_region";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)";NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);          ds.Reset();// filling DataSet with result from NpgsqlDataAdapter        da.Fill(ds);// since it C# DataSet can handle multiple tables, we will select first           dt = ds.Tables[0]; int count = dt.Rows.Count;for (int i = 0; i < count; i++){DataRow dr = dt.Rows[i];Site site = new Site{GID = dr[0].ToString(),SiteName = dr[1].ToString(),Geom = dr[2].ToString()};source.Add(site);}conn.Close();}catch (Exception ex){throw ex;}return source;}}

Program.cs

  static void Main(string[] args){ServiceHost host = new ServiceHost(typeof(SiteService));ServiceHost crossDomainserviceHost = new ServiceHost(typeof(DomainService));host.Opened += delegate{Console.WriteLine("服务已经启动,按任意键终止...");};crossDomainserviceHost.Opened += delegate{Console.WriteLine("跨域服务已经启动,按任意键终止...");};crossDomainserviceHost.Open();host.Open();Console.ReadKey();host.Close();host.Abort();crossDomainserviceHost.Close();crossDomainserviceHost.Abort();}

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

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

C#打造一个开源webgis(四)地图客户端(中)相关推荐

  1. 使用go的ssh包快速打造一个本地命令行ssh客户端

    2019独角兽企业重金招聘Python工程师标准>>> 热身运动? 在开始之前,先来个热身运动.虽然标题党写着快速打造一个ssh客户端,但是和跑步一样,在运动前还是需要先热身一下,不 ...

  2. 开源地图服务器 网站,开源WebGIS:地图发布与地图服务

    开源WebGIS:地图发布与地图服务 语音 编辑 锁定 讨论 上传视频 上传视频 本词条缺少信息栏.概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! <开源WebGIS:地图发布与 ...

  3. OpenHub——一个开源的GitHub Android客户端,快速简洁

    OpenHub 一个开源的GitHub Android客户端,快速简洁,支持GitHub主要功能,支持主题.主颜色.语言切换,SO COOL的语法高亮. 特点 App 两种登录方式,(Basic Au ...

  4. python写一个crm系统_用Python打造一个CRM系统(四)

    在上一篇中在本地进行初始化,并让项目顺利运行.在本篇中将实现一个线索管理模块,支持线索的增删改查. 新建线索应用模块 进入项目目录,使用django命令创建线索应用模块,命令如下: $ python ...

  5. WebGIS入门--如何做一个简单的校园地图服务网站

    目录 OpenLayer库的配置 在HTML中调用 在JavaScript文件中调用 OpenLayer基础操作 显示地图(天地图API) 百度地图API与天地图API 坐标系转换之百度地图 坐标系转 ...

  6. 从零打造一个Web地图引擎

    说到地图,大家一定很熟悉,平时应该都使用过百度地图.高德地图.腾讯地图等,如果涉及到地图相关的开发需求,也有很多选择,比如前面的几个地图都会提供一套js API,此外也有一些开源地图框架可以使用,比如 ...

  7. 【灯哥开源四足机器人】推荐一个开源四足机器狗项目,8自有度,两个舵机控制一个腿,apache开源协议的,已经迭代了好多个版本了,设计的非常好。有官方淘宝店,没有3D打印机的可以购买散装零件自己组装

    目录 前言 1,关于[灯哥开源四足机器人] 2,使用py-apple 3,总结 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/detail ...

  8. 用Javascript开发《三国志曹操传》-开源讲座(四)-用地图块拼成大地图

    小时候我们玩过拼图游戏,是用自己的手去拼的.今天我们来研究研究用javascript来拼图.同样是拼图,但用js拼图要比用手拼图麻烦多了,因此以后我要把它优化成引擎. 一.前言 以上是一段导语,话不扯 ...

  9. python项目源码 日程管理软件_分享:一个开源的基于时间管理四象限的待办管理工具...

    在完成这篇文章里要分享的一个开源小工具 todolist 之前,在网上找了不少日程管理,待办管理的小工具:开源的.收费的.有广告.需要注册的那也是不少: 根据自己平时的工作习惯:以及对时间管理的学习理 ...

  10. 服务器端配置正方教务系统,手把手带你打造一个教务系统客户端(附源码)

    本篇博客主要和大家分享编写一个学校教务系统的客户端版本,主要是关于登录以及数据获取方面,结尾还会附上本人以前编写的客户端源代码,有兴趣的可以自行下载玩耍~ 阅读本文大概需要5分钟. 前言 好久没有更新 ...

最新文章

  1. 学python需要学数据库吗-python可以使用什么数据库
  2. <力扣>-----利用哈希表来判断是否存在重复元素
  3. 经典C语言程序100例之四二
  4. [Windows]查看运行进程的参数【wmic】
  5. CSS一些实用的技巧
  6. C++静态类型成员变量的初始化顺序(单例模式)
  7. js异步请求php数据,原生JS发送异步数据请求实例详解
  8. linux中磁盘的iused,Linux 磁盘与文件系统管理
  9. easyui 年份下拉框的构建
  10. [翻译] REST API必须是超文本驱动的
  11. ZCuPb10Sn10铸造锡青铜板ZCuPb10Sn10力学性能
  12. 收文和发文管理流程分析
  13. 【2018.12.28】百度网盘永久保存2T容量办法
  14. DataFrame-删除行列
  15. Jackson Json 快速入门
  16. 昨天国际电子商情网站贴出了一篇文章《再论企业核心竞争力:为“黑芯”联发科喊冤》,引来争论无数
  17. 金蝶云星空和钉钉接口打通对接实战
  18. Mac电脑的一键切换输入法神器,自动切换输入法!
  19. 古希腊神话故事:狄俄尼索斯
  20. *继承IObjectSafety接口,实现vb activeX控件安全性(IE不提示安全问题)

热门文章

  1. 条码扫描枪的连接与使用方法
  2. UWP 如何阻止WebView自动打开浏览器?
  3. 利用beego开发网站(一)
  4. python识别图片手写文字_Python徒手实现识别手写数字—简易图片数据库
  5. 四大国有银行股份制改革的确切时间
  6. 【复】基于 WebRTC 的音视频在线监考模块的设计与实现(下)
  7. for循环中控制事务单个提交问题
  8. MyBatis-Plus批量保存
  9. Linux串口属性设置
  10. 马斯克的火箭上天了,SpaceX开源项目也登上了热榜!