您的位置:首页 > 其它

拥有正方形经纬度中心点、正方形边长,如何计算正方形范围内最大最小经纬度?

2017-08-17 11:45 621 查看
假设我们拥有了一个栅格边长为5米的栅格的中心点经纬度坐标,如何计算栅格的最大最小经纬度呢?

1)首先,需要把经纬度转化为mercator米坐标:

class Geometry(_x: Double, _y: Double) {
def x: Double = _x

def y: Double = _y
}

def lonLat2Mercator_(lon: Double, lat: Double): Geometry = {
val x = lon * 20037508.34 / 180;
var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180)
y = y * 20037508.34 / 180
new Geometry(x, y)
}


2)把栅格中心点换算为mercator米坐标后,可以根据栅格边长算出经、纬度最大、最小mercator坐标值:

var longitude: Double = 120.099878323
var latitude: Double = 30.876723923
var abc = lonLat2Mercator_(longitude, latitude)
var dfs: Geometry = mercator2lonLat(new Geometry(abc.x, abc.y))
println(dfs.x)
println(dfs.y)

var mercatorLngLat = lonLat2Mercator_(longitude, latitude)
var minX: Double = mercatorLngLat.x - 2.5
var maxX: Double = mercatorLngLat.x + 2.5
var minY: Double = mercatorLngLat.y - 2.5
var maxY: Double = mercatorLngLat.y + 2.5


3)把米坐标的最大最小经纬度转化为经纬度的最大最小经纬度,即为:栅格的最大最小经纬度。

var leftUpLngLat: Geometry = mercator2lonLat(new Geometry(minX, maxY))
var rightDownLngLat: Geometry = mercator2lonLat(new Geometry(maxX, minY))

var minLng: Double = leftUpLngLat.x
var maxLat: Double = leftUpLngLat.y
var maxLng: Double = rightDownLngLat.x
var minLat: Double = rightDownLngLat.y

println(minLng)
println(maxLng)
println(minLat)
println(maxLat)


def mercator2lonLat(mercator: Geometry): Geometry = {
val x: Double = mercator.x / 20037508.34 * 180
var y: Double = mercator.y / 20037508.34 * 180
y = 180 / Math.PI * (2 * Math.atan(Math.exp(y * Math.PI / 180)) - Math.PI / 2)

new Geometry(x, y)
}


验证数据结果:

"D:\Program Files\Java\jdk1.8.0_111\bin\java。。。"
com.intellij.rt.execution.application.AppMain TestScalaMain
120.099878323
30.876723923000004
120.09985586511787
120.09990078088211
30.87670464799393
30.876743198002185

Process finished with exit code 0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐