随笔-254  评论-3310  文章-48  trackbacks-74

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 


版权说明

  本文属原创文章,欢迎转载且注明文章出处,其版权归作者和博客园共有。为了保存作者的创作热情,请在转载后的明显位置标记本文出处。  

  作      者:Beniao

 文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

标签: oracle, Spatial, wkt
posted on 2011-11-21 22:36 Bēniaǒ 阅读(982) 评论(4) 编辑 收藏

评论:
#1楼 2011-11-22 09:29 | freemail[未注册用户]
bing地图升级了?我记得前段时间没中文的.
 回复 引用   
#2楼[楼主] 2011-11-22 13:17 | Bēniaǒ      
@freemail
引用freemail:bing地图升级了?我记得前段时间没中文的.

可以自定义TileSource实现加载中文地图。

 回复 引用 查看   
#3楼 2011-12-19 10:59 | jiangsoft      
@Bēniaǒ
可能告诉一下实现代码呀?谢谢

 回复 引用 查看   
#4楼[楼主] 2011-12-19 16:39 | Bēniaǒ      
@jiangsoft
引用jiangsoft:
@Bēniaǒ
可能告诉一下实现代码呀?谢谢

实现代码全部在文中,你复制到VS下就可以了,别懒惰得让我给你发示例代码用现成的。

 回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 2255657 D8yQGicUd8E=
微软最有价值专家(MVP)

微软技术社区精英(CNTAC)

2010年IT博客大赛50强

微软最有影响力开发者(GDI)


Bing Maps开发一群:75662563
微软技术群-重庆站:97035589
RIA技术联盟QQ群:26917590
昵称:Bēniaǒ
园龄:4年6个月
荣誉:推荐博客
粉丝:413
关注:26

随笔分类(285)

文章分类(14)

积分与排名

  • 积分 - 761107
  • 排名 - 60

最新评论