需求:小程序地图上需要展示某个省份是否有我们公司的产品在使用,如有,在地图上点亮该省份,亮点即为所有有产品使用地点的中心点。
直接贴代码了:
首先创建一个地点相关信息的dto,如下
package com.test.core.dto
/**
* 省市区内站点中心点坐标
* Created by pavel on 2019/3/13 0013
*/
class Coordinate {
/**
* 地点id
*/
long id
/**
* 地点名称
*/
String name
/**
* 站点数量
*/
int count
/**
* 中心点坐标
*/
double latitude
double longitude
}
根据多点计算中心点经纬度(直接套用即可,参数为多点的坐标集合):
/**
* 根据输入的地点坐标计算中心点
* @param coordinateList 坐标集合
* @return 中心点坐标
*/
Coordinate getCenterPointFromListOfCoordinates(List<Coordinate> coordinateList) {
def total = coordinateList.size() as int
def X = 0 as double
def Y = 0 as double
def Z = 0 as double
coordinateList.forEach{ coordinate ->
def lat = coordinate.latitude * Math.PI / 180
def lon = coordinate.longitude * Math.PI / 180
X += Math.cos(lat) * Math.cos(lon)
Y += Math.cos(lat) * Math.sin(lon)
Z += Math.sin(lat)
}
X = X / total
Y = Y / total
Z = Z / total
double lon2 = Math.atan2(Y, X)
double hyp = Math.sqrt(X * X + Y * Y)
double lat2 = Math.atan2(Z, hyp)
def coordinate2 = new Coordinate()
coordinate2.longitude = lon2 * 180 / Math.PI
coordinate2.latitude = lat2 * 180 / Math.PI
return coordinate2
}
可能看这个语法有点奇怪,哈哈,这不是java,是groovy,但相信大家都能看的懂。