openlayers6踩坑系列(七)坐标经纬度转换公式

本文介绍了OpenLayers中如何进行3857(墨卡托)与4326(WGS84)坐标系之间的转换。官方提供了fromLonLat和toLonLat两个函数进行便捷转换,同时也给出了经纬度手动转换的数学公式。了解这些转换对于正确显示和操作地图至关重要。
摘要由CSDN通过智能技术生成

openlayers 地图默认使用 3857坐标系(墨卡托坐标系) <===> 我们常用的 4326坐标系(WGS84坐标系)

既然是两种不同坐标系,那就需要对经纬度进行转换,openlayers官方给出的转换公式是(你可以直接调用 fromLonLat和toLonLat)

// 4326坐标转3857坐标, 这是官方的源码,很好理解,就是你直接用fromLonLat然后只传第一参数,默认就是 4326 转 3857
export function fromLonLat(coordinate, opt_projection) {
  return transform(
    coordinate,
    'EPSG:4326',
    opt_projection !== undefined ? opt_projection : 'EPSG:3857'
  );
}

// 3857坐标转4326坐标, 你直接用toLonLat然后只传第一参数,默认就是 3857 转 4326
export function toLonLat(coordinate, opt_projection) {
  const lonLat = transform(
    coordinate,
    opt_projection !== undefined ? opt_projection : 'EPSG:3857',
    'EPSG:4326'
  );
  const lon = lonLat[0];
  if (lon < -180 || lon > 180) {
    lonLat[0] = modulo(lon + 180, 360) - 180;
  }
  return lonLat;
}

然后我这里给出的是经纬度转换计算公式:

// 3857坐标系转4326坐标系
// 经度= 平面坐标x/20037508.34*180
// 纬度= 180/(PI*(2*atan(exp(平面坐标y/20037508.34*180*PI/180))-PI/2)

export function toLonLat(x, y) {
	let lon = (x / 20037508.34) * 180
	let lat = (y / 20037508.34) * 180
	lat = (180 / Math.PI) * (2 * Math.atan(Math.exp((lat * Math.PI) / 180)) - Math.PI / 2)
	return [lon, lat]
}

// 4326坐标系转3857坐标系
// 平面坐标x = 经度*20037508.34/108 平面坐标y = log(tan((90+纬度)*PI/360))/(PI/360)*20037508.34/180
export function fromLonLat(lon, lat) {
	let x = (lon * 20037508.34) / 180
	let y = Math.log(Math.tan(((90 + lat) * Math.PI) / 360)) / (Math.PI / 180)
	y = (y * 20037508.34) / 180
	return [x, y]
}

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenLayers 3 中,可以使用 `ol.source.OSM` 的 `getTile()` 方法获取指定经纬度的瓦片信息,进而判断该点是否在海洋上。 具体实现步骤如下: 1. 创建一个 OpenLayers 3 的地图对象,并设置地图的中心点和缩放级别。 ```javascript var map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }) ], view: new ol.View({ center: ol.proj.fromLonLat([0, 0]), zoom: 4 }) }); ``` 2. 定义一个函数,用于判断给定经纬度是否在海洋上。 ```javascript function isPointInOcean(lon, lat) { // 将经纬度转换OpenLayers 3 中的坐标系 var coord = ol.proj.fromLonLat([lon, lat]); // 获取包含该经纬度的瓦片信息 var tileInfo = map.getSource().getTile(14, 7937, -10175); // 判断该瓦片是否为海洋瓦片 if (tileInfo && tileInfo.getImage().src.indexOf('/0/0/0.png') !== -1) { return true; } else { return false; } } ``` 在上面的代码中,`getTile()` 方法的参数分别为瓦片的缩放级别、行号和列号。这里以缩放级别为 14、行号为 7937、列号为 -10175 的瓦片为例,获取包含给定经纬度的瓦片信息。 3. 调用判断函数,判断给定经纬度是否在海洋上。 ```javascript var lon = 120.152; var lat = 30.278; var isOcean = isPointInOcean(lon, lat); console.log(isOcean); // true 或 false ``` 在上面的代码中,给定经纬度为 `(120.152, 30.278)`,调用 `isPointInOcean()` 函数判断该点是否在海洋上。最终结果为 `true` 或 `false`,表示该点是否在海洋上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值