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);
}

 

 





本文转自 beniao 51CTO博客,原文链接:http://blog.51cto.com/beniao/721716,如需转载请自行联系原作者

目录
相关文章
|
3天前
|
SQL Oracle 关系型数据库
Oracle查看表空间 及表空间是否需要扩展
Oracle查看表空间 及表空间是否需要扩展
27 0
|
5月前
|
Oracle 关系型数据库 MySQL
php7.2安装OCI8扩展支持oracle数据库
做项目的时候,远程的oracle数据库为我们提供一张中间表,我这边业务中的一些数据是需要到oracle数据库中的这张中间表去查询的。 PHP连接oracle数据库。需要用到OCI8的扩展。说来惭愧,工作这么多年,还没有正经的使用过oracle数据库。 mysql数据库的语法跟oracle数据库的语法是不一样的,别跟我似的上来就用mysql的语法来操作oracle数据库……有点丢人了…… 今天我们大概记录一下OCI8扩展的安装过程。
68 0
|
7月前
|
Oracle Java 关系型数据库
JSP struts2工资管理系统myeclipse开发oracle数据库bs框架java编程网结构
JSP 工资管理系统是一套完善的struts2设计系统MVC结构,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Oracle10g,使用java语言开发,系统主要采用B/S模式开发。
48 1
|
7月前
|
Oracle Java 关系型数据库
JSP停车场车位管理系统myeclipse开发oracle数据库BS模式java编程网
JSP 停车场车位管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助servlet+bean+dao (mvc模式开发),系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Oracle 10g,使用java语言开发系统主要采用B/S模式开发。
38 0
|
SQL Oracle 关系型数据库
开发必备:EsayCode使用以及Oracle自定义模板
写前先问一句,不会还有人在手动写这些基础的sql语句吧?! 最近在做Oracle的项目,手写mapper和entity文件真是写到手软,以前MySQL都是找的线上自动生成的,现在也不行了。 找了很长时间,也试验了一下mybaties-plus,后来要感谢掘金群里的老哥(图片已同意)。虽然默认模板很难用,但是自定义模板优化后,凑合可以使用吧。
|
Oracle 关系型数据库
oracle学习24-数据文件设置自扩展和监听日志文件过大处理
oracle学习24-数据文件设置自扩展和监听日志文件过大处理
202 0
|
存储 SQL Oracle
oracle数据库实际项目中开发经验总结(上)
  1、在ORACLE中返回游标结果集   写包:   create or replace package pag_cs_power as   type c_Type is ref cursor;   FUNCTION FUN_CS_GETDICTLIST(   v_DictIndex in varchar2) return c_Type;   end pag_cs_power;   函数:
287 0
|
SQL Oracle 关系型数据库
Oracle/Mysql迁移到Postgresql事务回滚行为差异(开发避坑系列)
Mysql或Oracle迁移到Postgresql系产品后,经常会发生事务回滚导致的问题,具体问题一般都是类似于: **为什么我没rollback,我的事务就自己回滚了?** 下面我举一个简单的例子,说明下PG和其他两款DB在事务回滚行为上的差异 ## Oracle事务内报错后的行为 (完整代码贴在文章最后) ```java Class.fo
934 0
|
存储 Oracle 关系型数据库
Oracle表空间扩展
使用oracle时可能遇到无法通过8192在表空间中扩展错误,原因是数据库的表空间不足。 oralce默认数据块大小为8k,这种情况下,单文件最大为32G,但是默认块大小不能更改,如需更改需要重建数据库。
1371 0