当前位置: 首页 > news >正文

Bing Maps开发扩展:Oracle Spatial的空间数据渲染

Oracle Spatial的空间数据应用和微软SQL Server 2008的大同小异,SQL Server 2008提供了基于SQLCLR的编程支持,Oracle Spatial暂时还没有比较完善的组件支持。在实际开发应用中我们可以选择折中的解决方案,比如将空间数据读取为通用的空间数据表达格式(如:WKT),利用开源的WKT读取组件便可将WKT数据解析为对应的空间数据坐标点或坐标集合。

 

下面以一个实际的案例来介绍如何读取Oracle Spatial数据为WKT,并通过WKT组件解析数据,最终在Bing Maps中进行渲染。现要实现将数据库中地市表配置的全国地市数据中四川省的数据读取出来在地图中进行渲染,Oracle Spatial的sdo_geometry数据类型则可以直接使用函数(get_wkt())进行转换为clob数据类型数据。

select t.areacode,t.areaname, (t.area.get_wkt()) wkt from areainfo t where areacode like '8623%' 

 

为了方便客户端的使用,服务端可以通过WCF服务封装数据为数组返回,以下为地市实体对象数据结构和WCF服务的定义。 

namespace OracleSpatial.DataService.Models
{
    [DataContract]
     public  class AreaInfo
    {
        [DataMember]
         public  string AreaCode {  getset; }
        [DataMember]
         public  string AreaName {  getset; }
        [DataMember]
         public  string WKT {  getset; }
    }

} 

namespace OracleSpatial.DataService
{
    [ServiceContract]
     public  interface IGeometryService
    {
        [OperationContract]
        List<AreaInfo> GetAreaInfo();
    }

}

Bing Maps的Silverlight客户端调用WCF服务以获取数据库中的数据,这里就不做详细介绍。在这里需要特别介绍的是几个开源应用:

1、SharpMap开源的GeoAPI.

2、NetTopologySuite. 

 

这两个开源库分别定义好了不同GIS坐标系的空间标准,以及基于地理空间的空间对象、空间计算和空间分析接口,在应用开发中可以非常方便的完成空间数据的读写、验证、计算和分析功能。本文使用到了WKT读取组件(WKTReader),可以实现将WKT格式的字符串解析为符合GIS坐标系标准的通用空间对象(Geometry),此空间对象中就包含了完整的WKT数据的描述,如WKT所表示的坐标点,坐标点集合,内部坐标点,空间面积等等。

public MainPage()
{
    InitializeComponent();
     this.Loaded += (sender, e) =>
        {
            LoadChinaMap();
            GeometryServiceClient service =  new GeometryServiceClient();
            service.GetAreaInfoCompleted += service_GetAreaInfoCompleted;
            service.GetAreaInfoAsync();
        };
}

private  void service_GetAreaInfoCompleted( object sender, GetAreaInfoCompletedEventArgs e)
{
     if (e.Error ==  null)
    {
        ObservableCollection<AreaInfo> result = e.Result;
        WKTReader reader = reader =  new WKTReader();
        IGeometry geometry = reader.Read(result[ 0].WKT);
    }

}

 

       通过WKTReader将WKT格式的空间数据解析为IGeometry接口的空间对象,就可以非常方便的获取WKT空间数据中的各种坐标值。如果上面所获取到的数据,我们就可以通过绘制多边形以及通过自定义标注将数据渲染在地图中。

private void service_GetAreaInfoCompleted(object sender, GetAreaInfoCompletedEventArgs e)

{
     if (e.Error ==  null)
    {
        ObservableCollection<AreaInfo> result = e.Result;
        WKTReader reader =  null;
         foreach ( var item  in result)
        {
            reader =  new WKTReader();
            IGeometry geometry = reader.Read(item.WKT);

             // 边界
            MapPolygon line =  new MapPolygon();
            line.Locations = CoordinateConvertor.CoordinatesToLocationCollection(geometry.Coordinates);
            line.Fill =  new SolidColorBrush(Colors.Gray);
            line.BorderBrush =  new SolidColorBrush(Colors.Green);
            line.BorderThickness =  new Thickness( 2);
            line.MouseEnter +=  new MouseEventHandler(line_MouseEnter);
            line.MouseLeave +=  new MouseEventHandler(line_MouseLeave);
             this.mlayer.Children.Add(line);

             // 名称标注
             this.mlayer.AddChild( new PointControl(item.AreaName), 
                 new Microsoft.Maps.MapControl.Location(geometry.InteriorPoint.Y, geometry.InteriorPoint.X));
        }
    }
}

private  void line_MouseLeave( object sender, MouseEventArgs e)
{
    MapPolygon mp = sender  as MapPolygon;
    mp.Fill =  new SolidColorBrush(Colors.Gray);
            
}

private  void line_MouseEnter( object sender, MouseEventArgs e)
{
    MapPolygon mp = sender  as MapPolygon;
    mp.Fill =  new SolidColorBrush(Colors.Yellow);
}

 

 

 

相关资源:

[1]、SharpMap:http://sharpmap.codeplex.com  

[2]、NetTopologySuite:http://code.google.com/p/nettopologysuite

[3]、WKT:http://www.opengis.org/techno/specs.htm 

相关文章:

  • 脚本实现svn备份与恢复,基于rsync实现远程备份,并记录日志
  • 停止IE的bgsound元素的播放
  • css学习笔记
  • [windows phone 7开发]搭建WP7开发环境
  • LoadRunner8测试Web站点
  • WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构
  • 发现live555中一个小bug(2)
  • 转载:APP的上线和推广——线上推广渠道
  • 关于HashMap的建值取向
  • 【软件】Eclipse 下载
  • web service 开源项目比较
  • SOSO发布通用搜索引擎优化指南
  • 超越死亡:恩宠与勇气节选
  • linux进程与它的文件描述符2
  • 操作笔记:catalina.out膨胀太快,分割tomcat 7日志
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • CSS中外联样式表代表的含义
  • ERLANG 网工修炼笔记 ---- UDP
  • iOS 系统授权开发
  • JavaScript服务器推送技术之 WebSocket
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • magento2项目上线注意事项
  • php ci框架整合银盛支付
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • 半理解系列--Promise的进化史
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 关于for循环的简单归纳
  • 后端_MYSQL
  • 盘点那些不知名却常用的 Git 操作
  • 正则学习笔记
  • 大数据全解:定义、价值及挑战
  • # C++之functional库用法整理
  • # Java NIO(一)FileChannel
  • (06)金属布线——为半导体注入生命的连接
  • (12)目标检测_SSD基于pytorch搭建代码
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (js)循环条件满足时终止循环
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .apk文件,IIS不支持下载解决
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .Net Redis的秒杀Dome和异步执行
  • .Net 高效开发之不可错过的实用工具
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .Net面试题4
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • // an array of int
  • /etc/fstab和/etc/mtab的区别
  • @RunWith注解作用