openlayers第二天

本文介绍如何使用OpenLayers实现地图上的点选查询功能,详细解释了如何配置Geoserver和OpenLayers,以及如何处理点击事件获取地理信息,并解决了跨域问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

openlayers第二天,点选查询

需求:点击地图上的某个点如一个商店,返回这个商店的属性信息。

架构:postgresql存储商店的属性信息和空间位置数据,geoserver连接上数据库发布wms和wfs服务,前端用openlayers显示。推荐一个博客,我是看着它一步一步搭建好框架的。

废话少说,先上代码,以下代码中非js部分是从官网拷贝,官网也有诸多例子可供学习。

<!DOCTYPE html>
<html>
<head>
    <title>Accessible Map</title>
    <link rel="stylesheet" href="https://openlayers.org/en/v4.6.5/css/ol.css" type="text/css">
    <script src="https://openlayers.org/en/v4.6.5/build/ol.js"></script>
</head>
<body>
<div id="map" class="map" tabindex="0"></div>
<script>
    var baseGaodeMap = new ol.layer.Tile({//标准地图
        source: new ol.source.XYZ({
            crossOrigin: 'anonymous',
            url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}'
        })
    });
    var myLayer = new ol.layer.Image({
        source: new ol.source.ImageWMS({
            ratio: 1,
            //自己的服务url
            url: 'http://[IP]:[端口]/geoserver/[工作区]/wms',
            //设置服务参数
            params: {
                'FORMAT': 'image/png',
                'VERSION': '1.1.0',
                STYLES: '',
                //图层信息
                LAYERS: '[工作区]:[图层名]',
            }
        })
    });
    var bounds = [116.38657515099074, 39.90773664369626, 116.41161625435377, 39.92026792421384];
    var projection = new ol.proj.Projection({
        code: 'EPSG:4326',
        units: 'degrees',
        axisOrientation: 'neu'
    });
    var view = new ol.View({
        projection: projection,
        maxZoom: 20
    });
    var map = new ol.Map({
        target: 'map',
        layers: [
            baseGaodeMap,
            myLayer
        ],
        view: view
    });
    map.getView().fit(bounds, map.getSize());
    map.on('click', function (evt) {
        console.log(evt.coordinate);
        var viewResolution = (map.getView().getResolution());
        var url = myLayer.getSource().getGetFeatureInfoUrl(
            evt.coordinate, viewResolution, 'EPSG:4326',
            {'INFO_FORMAT': 'application/json'});
        if (url) {
            console.log(url);
            $.ajax("http://[IP]:[端口]/[自定义]", {
                type: 'GET',
                data: {
                    token: token,
                    url: url
                },
                dataType: 'jsonp',
                jsonpCallback: 'callback:myCallback',
                jsonp: 'format_options'
            });
        }
    });

    function myCallback(json) {
        console.log(json);
    }
</script>
</body>
</html>

搭建geoserver发布图层可以参照我推荐的博客,服务发布后直接复制链接到代码中即可直接运行。

下面研究一下点击地图后查询的代码:

map.on('click', function (evt) {
        console.log(evt.coordinate);
        var viewResolution = (map.getView().getResolution());
        console.log(viewResolution);
        var url = outworkMap.getSource().getGetFeatureInfoUrl(
            evt.coordinate, viewResolution, 'EPSG:4326',
            {'INFO_FORMAT': 'application/json'});
        ...
}

可以看到,通过map的单击事件返回的evt.coordinate,可以取得当前点击位置的经纬度坐标。
图层的数据源+经纬度坐标+当前的分辨率+坐标系类型+请求返回类型—–>生成返回的url
直接访问这个url,就能返回当前点击位置的商店的信息。
出现的问题:

  • 多图层查询
  • 点击精度
  • 跨域

多图层查询以后再说,点击精度是通过viewResolution来控制的,直接用地图放大到最大时的分辨率,应该就能达到最精准的效果。
接下来主要讲讲跨域的问题。
关于geoserver跨域的解决方法网上有很多,但是要么没用要么就是太麻烦,我使用的方案是本地不直接请求geoserver,而是请求后台并带上这里生成的url作为参数,后台去访问这个url然后返回结果,这里后台相当于是一个代理,也可以记录下访问日志。
当然,最简单的方式是部署到同一个服务器的同一个端口下,就没跨域什么事了。

后台的代码简单贴一下

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

@RestController
@RequestMapping(produces = "application/json")
public class RedirectController {
    @GetMapping("/redirect")
    public String redirect(@RequestParam String url) throws IOException, URISyntaxException {
        RequestConfig config = RequestConfig.custom().setConnectTimeout(60000).setSocketTimeout(15000).build();
        HttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
        URL tempUrl = new URL(url);
        URI uri = new URI(tempUrl.getProtocol(), null, tempUrl.getHost(), tempUrl.getPort(), tempUrl.getPath(), tempUrl.getQuery(), null);
        HttpGet httpGet = new HttpGet(uri);
        HttpResponse response = httpClient.execute(httpGet);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity, "UTF-8");
        return callback(result);
    }

    private String callback(String str) {
        return "myCallback('" + str + "')";
    }

}

openlayers第二天,从点选查询开始

请问在openlayers中如何删除Layer中的marker 3 在层中加了一个标记怎么永久的存到地图上 3 OpenLayers 如何设死地图边界 3 谁写过openlayers解析xml 3 openlayer.popup 3 OpenLayers 怎么做字段标注 4 字段标注不是用OL做的,而是你在SLD中定义用数据表的哪个字段做标签就可以了 4 OpenLayers 中画最短轨迹 4 使用TileCache配合OpenLayers 4 openlayers如何准确测距 9 openlayers简单实用例子 9 关于TileCache函数 13 openlayers 有函数说明的类图 14 go 14 Maker 一多,客户端就死掉 15 OpenLayers 怎么实现 AJAX 16 openlayer 要怎么研究才会应用得比较自如 16 改良OpenLayers的Popup 16 在openlayers的地图中要添加地图搜索功能一般采用什么方法 17 openlayers中如何访问geoserver发布的图片 18 什么是TMS? 18 怎样设置瓦片的大小 18 画一条线,数据量太大,怎么办? 18 怎么在图层上动态画点 20 GeoExt集成google map ,地图偏移 21 用JavaScript为OpenLayers.Marker的加上单击显示详细信息的功能 21 改良OpenLayers的MousePostion 25 使用OpenLayers实现一个在鼠标点击处添加标记的效果 27 openlayers 利用google maps的卫星地图 29 openLayers集成google map ,点标注错位 30 openlayers可以做出谷歌效果的地图吗? 31 用OpenLayers API和类来画点、线、面 32 OGC标准术语介绍WMS、WFS、WCS 35 如何控制地图的放缩 37 openLayers链接WMS的代码探讨 37 openlayers 2.5 矢量层在ie下闪烁的问题 38 openLayers 在地图上添加一个点并保存 39 openLayers 各个参数的意义 42 geoserver能搞出这种风格的图来吗? 43 关于SLD的线切割后的设置 43 GEOSERVE 标注铁路,使用 SLD 44 geoserver 发布.shp 中文乱码问题 怎么解决啊 45 Geoserver怎么连postGreSql 数据库 48 Geoserver连Oracle Spatial 52 GeoServer架构浅谈 53 Geoserver发布地图无法显示问题 57 WebGIS相关的OpenGIS规范 58 geoserver中地图以外的区域以自定义图片填充 62 怎样修改 geoServer 的用户名密码 65 GeoServer中的WMS服务生成的png图片背景色为透明 65 比例尺 65 需不需要一个layer对应一个store 66 如何部署shp 66 用GeoWebCache后Marker错位 66 标签太大导致不能显示? 67 geoserver把两个shapefile格式的图叠 67 GeoServer 能够集成 Google Map? 68 gwc地图切片的缓存路径在web.xml中设置么 68 如何实现地图查询? 68 sld文件怎么用 69 在sld中怎么控制路名的间隔? 69
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值