您的位置:首页 > 运维架构

OpenLayers开发:调用矢量图层

2015-07-14 15:09 393 查看
除栅格数据外,GIS系统中另一类重要的数据类型便是矢量数据。OpenLayers中提供了多种操作矢量数据的方式,可以处理不同数据源、不同协议(HTTP、WFS)、不同格式(GML、KML、GeoJSON、GeoRSS等)的矢量数据。涉及的主要操作类包括OpenLayers.Layer.Vector、OpenLayers.Feature.Vector、OpenLayers.Feature、OpenLayers.Geometry、OpenLayers.Protocol等。

调用GML图层

GeographyMarkup Language (GML)是一个已经被广泛采纳了的OGC标准,采用XML语法来描述地理要素。下面的方法可以从GML文件创建矢量图层。

1.创建HTML文件,引入OpenLayers开发包,插入如下代码:

<!-- Map DOM element -->
<div id="gml"style="width: 100%; height: 100%;"></div>
2. 接下来,创建地图实例对象,添加图层和相应控件。这里展示了OpenStreetMap的调用方法,实际应用中应按照前面所讨论的方法调用自己的地图。在使用不同的地图作为底图的过程中,应注意区分投影与否,以及不同投影、不同坐标系等空间参考。

<!-- The magic comes here-->
<scripttype="text/javascript">
//Create the map using the specified DOM element
varmap = new OpenLayers.Map("gml");
varlayer = new OpenLayers.Layer.OSM("OpenStreetMap");
map.addLayer(layer);
map.addControl(newOpenLayers.Control.LayerSwitcher());
map.setCenter(newOpenLayers.LonLat(0,0), 2);
3.读取GML文件,并转换为矢量图层添加至map中:

map.addLayer(newOpenLayers.Layer.Vector("Europe (GML)", {
protocol:new OpenLayers.Protocol.HTTP({
//指向特定GML文件的URL
url:"http://.../.../....gml",
format:new OpenLayers.Format.GML()
}),
strategies:[new OpenLayers.Strategy.Fixed()]
}));
</script>

调用KML图层

KeyholeMarkup Language (KML)是另一种描述地理要素的矢量格式,源自于GoogleMaps,现在也已经变成了OGC的一种标准。

1.创建HTML文件,引入OpenLayers开发包,插入如下代码:

<!-- Map DOM element -->
<div id="kml"style="width: 100%; height: 100%;"></div>
2. 接下来,创建地图实例对象,添加图层和相应控件。

<!-- The magic comes here-->
<scripttype="text/javascript">
//Create the map using the specified DOM element
varmap = new OpenLayers.Map("kml");
varlayer = new OpenLayers.Layer.OSM("OpenStreetMap");
layer.wrapDateLine= false;
map.addLayer(layer);
map.addControl(newOpenLayers.Control.LayerSwitcher());
map.setCenter(newOpenLayers.LonLat(0,0), 2);
3.读取KML文件,并转换为矢量图层添加至map中:

//Global Undersea Fiber Cables
map.addLayer(newOpenLayers.Layer.Vector("GlobalUndersea Fiber Cables", {
protocol:new OpenLayers.Protocol.HTTP({
//指向特定KML文件的URL
url:"http:// http://.../.../....kml", format:new OpenLayers.Format.KML({
extractStyles:true,
extractAttributes:true
})
}),
strategies:[new OpenLayers.Strategy.Fixed()]
}));
</script>

调用WFS图层

WebFeature Service (WFS)是OGC的另一个标准规范,它规定了地图服务器以统一的方式发布矢量要素,客户端则严格按照该方式获取该矢量要素。实际上是客户端对服务器做了异步的HTTP请求,服务器端则以GML文件的形式返回给客户端,客户端完成对GML文件的解析并生成矢量图层,呈现给用户。

WFS请求过程中应特别注意的是WFS请求可能会导致客户端跨域请求,一般的解决方法是使用服务器端代理,避免由客户端浏览器直接向不同的域做出请求。

以下介绍WFS图层的加载过程。

1.创建HTML文件,引入OpenLayers开发包,插入如下div元素:

<!-- Map DOM element -->
<div id="map"style="width: 100%; height: 100%;"></div>
2.将proxy.jsp跨域请求代理文件拷贝到项目中,并引用到javascript脚本程序中。

<!-- The magic comes here-->
<scripttype="text/javascript">
OpenLayers.ProxyHost= "proxy.jsp?url="; //跨域请求代理文件
3.创建地图实例对象,添加图层和相应控件。

//提供WMS服务的URL
varwmsurl = "http://map.chinalbs.org/beyonserver/gwc/service/wms";
//定义地图选项
varmapOptions = {
//地图分辨率(以下以度为单位),定义了地图缩放层级
resolutions: [0.703125, 0.3515625,0.17578125, 0.087890625, 0.0439453125, 0.02197265625, 0.010986328125, 0.0054931640625,0.00274658203125, 0.001373291015625, 6.866455078125E-4,
3.4332275390625E-4,1.71661376953125E-4, 8.58306884765625E-5, 4.291534423828125E-5, 2.1457672119140625E-5, 1.0728836059570312E-5,5.364418029785156E-6, 2.682209014892578E-6],
//空间参考,以EPSG代码表示,“EPSG:4326”代表WGS-84地理坐标系
projection: newOpenLayers.Projection('EPSG:4326'),
//地图范围
maxExtent: newOpenLayers.Bounds(-180.0, -90.0, 180.0, 90.0),
//可以在以下语句中添加控件
controls: []
};
// 使用指定的文档元素创建map实例对象,这里的"map"就是页面中DIV元素的ID
varmap = new OpenLayers.Map("map", mapOptions);

//定义"中国"图层,访问指定的WMSURL,图层或图层组的名字为china,图片格式为png8
var china = new OpenLayers.Layer.WMS(
"中国",wmsurl,
{
layers: 'china',
format: 'image/png8'
},
{
buffer: 1,
displayOutsideMaxExtent: true,
//设置该图层的显示级别
//maxResolution: 0.703125,
//将该图层设置为基础图层,每个地图窗口中有且仅有一个基础图层
isBaseLayer: true
}
);
//定义"中国注记"图层,图层名字为b0100p014,图片格式为png8
var china_p = new OpenLayers.Layer.WMS(
"中国注记",wmsurl,
{
LAYERS: 'beyondb:b0100p014',
STYLES: '',
format: 'image/png8',
tiled: true
},
{
buffer: 1,
displayOutsideMaxExtent: true,
isBaseLayer: false,
transitionEffect: "none"
//minResolution: 0.00274658203125
}
);

//向map对象中添加以上定义的图层
map.addLayers([china,china_p]);
//设置地图中心和缩放级别
map.setCenter(newOpenLayers.LonLat(116.39, 39.91), 8);

//增加Navigation导航控件,可以随鼠标拖动、滑轮滚动操作地图
map.addControl(newOpenLayers.Control.Navigation());
//增加图层列表控件,用于控制图层显示与隐藏
map.addControl(newOpenLayers.Control.LayerSwitcher());
4.使用WFS协议请求资源,并生成矢量图层,添加到地图。

//实例化OpenLayers.Layer.Vector类
varwfsLayer = new OpenLayers.Layer.Vector("企业",{
//WFS请求协议
protocol:new OpenLayers.Protocol.WFS({
//请求资源URL
url:"http://simap.chinalbs.org/beyonserver/beyondb/wfs",
//图层名称
featureType:"t0703p001",
//空间参考系统,默认为"EPSG:4326"
srsName: "EPSG:4326",
//表示地理要素的属性字段名称
geometryName: "the_geom",
//版本
version: "1.0.0"
}),
//使用OpenLayers.Strategy.BBOX策略,该策略指示该图层随地图窗口的变化而刷新内容
strategies:[new OpenLayers.Strategy.BBOX()]
});
map.addLayer(wfsLayer);
</script>

结果如下图所示:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: