开发者社区> 余二五> 正文

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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
oracle学习24-数据文件设置自扩展和监听日志文件过大处理
oracle学习24-数据文件设置自扩展和监听日志文件过大处理
65 0
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;   函数:
163 0
Oracle/Mysql迁移到Postgresql事务回滚行为差异(开发避坑系列)
Mysql或Oracle迁移到Postgresql系产品后,经常会发生事务回滚导致的问题,具体问题一般都是类似于: **为什么我没rollback,我的事务就自己回滚了?** 下面我举一个简单的例子,说明下PG和其他两款DB在事务回滚行为上的差异 ## Oracle事务内报错后的行为 (完整代码贴在文章最后) ```java Class.fo
661 0
Oracle表空间扩展
使用oracle时可能遇到无法通过8192在表空间中扩展错误,原因是数据库的表空间不足。 oralce默认数据块大小为8k,这种情况下,单文件最大为32G,但是默认块大小不能更改,如需更改需要重建数据库。
1187 0
【PG云栖周刊】第2期·PostGIS北京3月活动,存储扩展引擎zheap,Oracle兼容性之 - 数据类型
3月17-18 PG象行中国2018-地理信息处理GIS专题(北京站),活动地点:北京师范大学 艺术楼 201教室;PostgreSQL最新存储扩展引擎zheap,计划加入到PG12;PostgreSQL 10.3更新版本发布;云数据库PPAS Oracle兼容性 - 数据类型;PostgreSQL中HOOK的使用,避免误删库的问题。
4985 0
+关注
余二五
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
EasyDBforOracle— 基于阿里云的Oracle最佳实践
立即下载
Oracle云上最佳实践
立即下载
迁移 ORACLE 最佳实践
立即下载