背景
有一个需要是需要根据用户输入的位置信息,自动转化为经纬度坐标,并在地图中标记出具体位置。
使用百度API获取地理位置经纬度信息
官网地址:http://lbs.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad
配置后得到AK(注意白名单配置)
import io.itit.itf.okhttp.FastHttpClient;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
import java.text.DecimalFormat;
/**
* 地理编码工具
*
* @author zhy
* @date 2020/11/25 9:51
*/
@Slf4j
public class GeocoderUtil {
/**
* 调用百度地图API根据地址,获取坐标
*
* @param address 地址越详细越好
* @return String 逗号隔开
*/
public static String getCoordinate(String address) {
try {
if (address != null && !"".equals(address)) {
address = address.replaceAll("\\s*", "").replace("#", "栋");
String url = "http://api.map.baidu.com/geocoding/v3/?address=" + address + "&output=json&ak=你的AK";
String s = FastHttpClient.get().url(url).build().execute().string();
JSONObject obj = JSONObject.fromObject(s);
if ("0".equals(obj.getString("status"))) {
double lng = obj.getJSONObject("result").getJSONObject("location").getDouble("lng");
double lat = obj.getJSONObject("result").getJSONObject("location").getDouble("lat");
DecimalFormat df = new DecimalFormat("#.######");
return df.format(lng) + "," + df.format(lat);
}
}
} catch (Exception e) {
log.error("GeocoderUtil.getCoordinate error:{}", e.getMessage());
}
return "";
}
}
经纬度转换
我是在前端页面中进行经纬度的转换的。公式:
toMars(longitude, latitude) {
let x_pi = (3.14159265358979324 * 3000.0) / 180.0;
let x = longitude - 0.0065;
let y = latitude - 0.006;
let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
return [z * Math.cos(theta), z * Math.sin(theta)];
}
最后参考之前的博文进行坐标点绘制就可以了
扩展知识:
火星坐标
火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地图、导航设备都是采用的这一坐标系或在这一坐标的基础上进行二次加密得到的。
火星坐标的真实名称应该是GCJ-02坐标。最近在知乎上看到关于火星坐标的话题都是充满争议的(点我跳转到知乎),感兴趣的同学可以去详细了解一下。
基本上所有的国内的电子地图采用的都是火星坐标系甚至Google地图中国部分都特意为中国政府做了偏移。
实用中:IPC等布控球一般上报的GCJ-02坐标。
百度坐标
火星坐标是在国际标准坐标WGS-84上进行的一次加密,由于国内的电子地图都要至少使用火星坐标进行一次加密,百度直接就任性一些,直接自己又研究了一套加密算法,来了个
二次加密,这就是我们所熟知的百度坐标(BD-09),不知道以后其他的公司还会不会有三次加密,四次加密。。。
当然只有百度地图使用的是百度坐标
WGS-84坐标
WGS-84坐标是一个国际的标准,一般卫星导航,原始的GPS设备中的数据都是采用这一坐标系。
国外的Google地图、OSM等采用的都是这一坐标。
实际中:Android终端直接获取原始gps设备上报的坐标为wgs-84