感谢开源,使用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. 'X',-180,180,0.005),
30. 'Y',-90,90,0.005),
31. '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. 'X',-180,180,0.005),
42. 'Y',-90,90,0.005),
43. '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. 'X',-180,180,0.005),
54. 'Y',-90,90,0.005),
55. '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. ));
上面的代码构造了一个空间对象,该对象的说明可以参考相关文档,这里就不详细说明了。准备好数据以后就可以进行数据发布了,数据发布是其中比较没有技术含量的体力活。
数据发布好后,可以进行数据展示了,数据展示可以套用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. "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);