• Oracle spatial、openlayers、geoserver开发地理信息系统总结


    感谢开源,使用OpenLayers+Geoserver的地理信息系统开发很简单,完全可以套用开发MIS系统的经验,我这里总结为三个步骤:

    1、数据准备

    2、数据发布

    3、数据展现

    我将按照这个思路来介绍,首先是数据发布:

    一、数据发布

    GIS数据源是多种多样的,有矢量数据、有栅格数据、有文本数据库、有关系型数据库,由于我平时主要使用Oracle 空间数据库和PostGIS,Oracle用得多一些,所以我以Oracle为例来说明,其他的触类旁通,至少我遇到的大部分是这样的。

    使用Oracle管理空间数据完全可以当作是关系性数据库,这就是我是的可以套用MIS系统经验的原因,Oracle空间数据库增加了一个空间对象MDSYS.SDO_GEOMETRY来存储空间数据,就像varchar,int这些类型一样,但是这个类型是个对象。

    需要注意的是,这个空间对象要正确发布需要创建空间索引,而要创建空间索引则要现在元数据表中进行定义,下面我就空间图形中基础的点线面来示例如何创建空间数据库表:

    Sql代码  收藏代码
    1. --创建表  
    2. create table t_point  
    3. (  
    4.   id       number,  
    5.   name nvarchar2(256),  
    6.   position  MDSYS.SDO_GEOMETRY  
    7. );  
    8.   
    9. create table t_line  
    10. (  
    11.   id       number,  
    12.   name nvarchar2(256),  
    13.   position  MDSYS.SDO_GEOMETRY  
    14. );  
    15.   
    16. create table t_area  
    17. (  
    18.   id       number,  
    19.   name nvarchar2(256),  
    20.   position  MDSYS.SDO_GEOMETRY  
    21. );  
    22.   
    23. --创建空间索引  
    24. insert into user_sdo_geom_metadata(table_name,COLUMN_NAME, DIMINFO)   
    25.        values(  
    26.               'T_POINT',  
    27.               'POSITION',  
    28.                MDSYS.SDO_DIM_ARRAY(  
    29.                     MDSYS.SDO_DIM_ELEMENT('X',-180,180,0.005),  
    30.                     MDSYS.SDO_DIM_ELEMENT('Y',-90,90,0.005),  
    31.     MDSYS.SDO_DIM_ELEMENT('Z',-9000,9000,0.005)  
    32.                )  
    33.        );  
    34. CREATE INDEX IDX_T_POINT_POS ON T_POINT(POSITION) INDEXTYPE IS MDSYS.SPATIAL_INDEX;  
    35.   
    36. insert into user_sdo_geom_metadata(table_name,COLUMN_NAME, DIMINFO)   
    37.        values(  
    38.               'T_LINE',  
    39.               'POSITION',  
    40.                MDSYS.SDO_DIM_ARRAY(  
    41.                     MDSYS.SDO_DIM_ELEMENT('X',-180,180,0.005),  
    42.                     MDSYS.SDO_DIM_ELEMENT('Y',-90,90,0.005),  
    43.     MDSYS.SDO_DIM_ELEMENT('Z',-9000,9000,0.005)  
    44.                )  
    45.        );  
    46. CREATE INDEX IDX_T_LINE_POS ON T_LINE(POSITION) INDEXTYPE IS MDSYS.SPATIAL_INDEX;  
    47.   
    48. insert into user_sdo_geom_metadata(table_name, COLUMN_NAME, DIMINFO)   
    49.        values(  
    50.               'T_AREA',  
    51.               'POSITION',  
    52.                MDSYS.SDO_DIM_ARRAY(  
    53.                     MDSYS.SDO_DIM_ELEMENT('X',-180,180,0.005),  
    54.                     MDSYS.SDO_DIM_ELEMENT('Y',-90,90,0.005),  
    55.     MDSYS.SDO_DIM_ELEMENT('Z',-9000,9000,0.005)  
    56.                )  
    57.        );  
    58. CREATE INDEX IDX_T_AREA_POS ON T_AREA(POSITION) INDEXTYPE IS MDSYS.SPATIAL_INDEX;  

     现在可以看到,空间表创建好了,我们可以像操作普通关系数据库一样进行操作,下面用一个插入例子来说明:

    Sql代码  收藏代码
    1. --插入点  
    2. insert into t_point(id, name, position)  
    3. values  
    4. (1, 'test point',  
    5. MDSYS.SDO_GEOMETRY (3001,  
    6.                                     NULL,  
    7.                                     NULL,  
    8.                                     MDSYS.sdo_elem_info_array (1, 1, 1, 4, 1, 0),  
    9.                                     MDSYS.sdo_ordinate_array (24.886436,  
    10.                                                              102.784423,  
    11.                                                              0,  
    12.                                                              1,  
    13.                                                              0,  
    14.                                                              0  
    15.                                                             )  
    16.                                   )  
    17. );  
    18. --插入线  
    19. insert into t_line(id, name, position)  
    20. values  
    21. (1, 'test line',MDSYS.SDO_GEOMETRY (3002,  
    22.                                     NULL,  
    23.                                     NULL,  
    24.                                     MDSYS.sdo_elem_info_array (1, 2, 1),  
    25.                                     MDSYS.sdo_ordinate_array (0, 0, 0, 0, 90, 0, 200, 90 , 0, 200, 0, 0)  
    26.                                   ));  
    27. --插入面  
    28. insert into t_area(id, name, position)  
    29. values  
    30. (1, 'test area',MDSYS.SDO_GEOMETRY (3003,  
    31.                                     NULL,  
    32.                                     NULL,  
    33.                                     MDSYS.sdo_elem_info_array (1, 1003, 1),  
    34.                                     MDSYS.sdo_ordinate_array (0, 0, 0, 0, 90, 0, 200, 90 , 0, 200, 0, 0, 0, 0, 0)  
    35.                                   ));  

     上面的代码构造了一个空间对象,该对象的说明可以参考相关文档,这里就不详细说明了。准备好数据以后就可以进行数据发布了,数据发布是其中比较没有技术含量的体力活,可以参考这里的一系列文章:http://www.cnblogs.com/beniao/archive/2011/01/08/1930822.html

    数据发布好后,可以进行数据展示了,数据展示可以套用MIS的控件概念,按照如下步骤开展:

    1、创建地图控件

    2、创建图层

    3、在地图中加入图层

    4、在地图中加入其他控件

    详细如下代码所示:

    Js代码  收藏代码
    1. //初始化地图  
    2. //var map = new OpenLayers.Map('map');  
    3. var map = new OpenLayers.Map({  
    4. div:"map",  
    5. maxExtent:[97.027587,21.166484,106.739502,29.31642],  
    6. center:new OpenLayers.LonLat(101.857909,24.726875)  
    7.     });  
    8. //新建图层  
    9. var ol_wms = new OpenLayers.Layer.WMS(  
    10.    "OpenLayers WMS",  
    11.    "http://10.180.80.206:9000/geoserver/wms",  
    12.    {layers: "sdgis:DQJ"}  
    13. );  
    14.   
    15. //添加地图控件  
    16. map.addControl(new OpenLayers.Control.LayerSwitcher());  
    17. map.addControl(new OpenLayers.Control.MousePosition());  
    18. map.addControl(new OpenLayers.Control.Scale());  
    19. //图层加入地图  
    20. map.addLayers([ol_wms]);  
    21. map.zoomToExtent([97.027587, 21.166484, 106.739502, 27.467659], true);  
  • 相关阅读:
    基于分布式思想下的RPC解决方案--笔记
    前端对页面展示修改出现的问题------行内块元素(标签)、行内元素(标签)、块元素(标签)的区别
    POI读取带有图片(图片有的是合并单元格的)的商品列表Excel
    Springboot 默认加载文件(可直接访问、不可直接访问)是出现的问题
    for循环快还是递归快
    try catch finally 中遇到的return问题(经典)
    为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作
    数据结构Java实现03----单向链表的插入和删除
    匿名内部类详解(粗略)
    非法字符: 'ufeff' idea下的解决方案
  • 原文地址:https://www.cnblogs.com/zhaoyanhaoBlog/p/9026389.html
Copyright © 2020-2023  润新知