uniapp+leaflet+proj4js中实现wms图层点击事件

        在项目中遇到需要实现点击图斑并处理相关事件。但图斑中保存坐标系为EPSG:4527坐标系,需要先转换为EPSG:4326坐标系,也就是wgs84。坐标系处理可以通过proj4js来实现。

        首先引入axios和proj4js:

	import proj4 from "proj4"
	import axios from 'axios'

        坐标系转换:

                    // 定义EPSG:4326和EPSG:4527的投影信息
					proj4.defs("EPSG:4326","+proj=longlat +datum=WGS84 +no_defs +type=crs");
					proj4.defs("EPSG:4527","+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=GRS80 +units=m +no_defs +type=crs");
					
					const wgs84Coords = [e.latlng.lng, e.latlng.lat]; // 经度, 纬度
					// 将EPSG:4326坐标转换为EPSG:4527坐标
					var transformedCoordinates = proj4("EPSG:4326","EPSG:4527",[e.latlng.lng, e.latlng.lat]);
					
					
					// 输出转换结果
					console.log('EPSG:4527 坐标:', transformedCoordinates);

        这里在定义proj4坐标系的时候,参数需要填写坐标系信息,这里坐标系信息后需要跟上坐标系定义,具体每个坐标系定义可以从这个网站获取:

        EPSG.io: Coordinate Systems Worldwide

        在使用坐标系定义的时候需要在网页下方选择对应的定义规则:

        我这里使用的是geoserver,所以选择好定义,并且复制。即可进行坐标系转换。

        因为leaflet的wms图层无法直接绑定点击事件。可以从使用map进行全局事件绑定,然后通过proj4进行坐标系转换,发送一个请求指向geoserver,这样就可以拿到对应图斑或位置的返回信息。

this.map.on('click', function (e) {
                    const BBOX = [transformedCoordinates[0],transformedCoordinates[1],1+transformedCoordinates[0],1+transformedCoordinates[1]]
					var url = wmsLayer._url + L.Util.getParamString({
					    info_format: 'application/json',  // 请求返回 GeoJSON 格式
					    request: 'GetFeatureInfo',
					    service: 'WMS',
					    srs: wmsLayerSrs,
					    version: '1.1.1',
					    layers: wmsLayerName,
					    query_layers: wmsLayerName,
					    styles: wmsLayerStyle,
						bbox:BBOX,
					    feature_count: 1,
						width:101,
						height:101,
					    x: 50,
					    y: 50
					});	
					
					console.log(url);
					var homethis = this;
					axios.get(url).then(function (res){
                        //此处在res中可拿到数据,在res中拿到数据之后,对相对应的数据进行处理。绘制拿到的geojson或是跳转等。
						console.log(res.data);
					})
					

        在这里定义的时候,需要注意一下,如果url地址是直接从请求中复制出来的话,这里需要同时修改info_format为application/json。并且这里有个bbox参数,这个参数中传入的是x的范围和y的范围。在我这里使用的是39坐标系,所以对范围使用+1操作,如果实际使用的坐标系为wgs84的话,这里根据需要具体调整。

        这里使用的是uniapp的randerjs,在randerjs中无法使用uni的相关接口。所以这里使用的是axios,axios可以直接在标签内引入。

        如果在res中需要使用到uni的api,可通过randerjs渲染至上方逻辑层,之后再次进行操作。具体内容可参考uniapp官方的randerjs的demo演示查看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值