场景:
1.在安全性较高的场景中,程序部署在内网,无法通过地图api接口获取地理位置信息,如下程序通过解析json数据获取对应区域地理位置信息(注:地理位置信息精确度根据json数据详细度正相关)。
2.代码采用线程池(也可改为消息队列)异步执行经纬度转换为地理位置信息。
优点/缺点
优点:1.采用线程池,2.解决了在内网项目上地图中展示 标注(经纬度点)。
缺点:大量数据同时转化需要加锁,json地理位置数据详细度不够全面.
待改进:1.加载json地理位置数据应改为单列。2.json地理位置数据应该新建数据库表导入到表中,去数据表中查询,减少x响应速度。
//1.创建线程池 参数应该根据业务量、系统环境进行修改
private static ExecutorService executorService = new ThreadPoolExecutor(3, 10, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(2048));
//2.封装转化方法 Address-业务数据对象里面有需要转化的经纬度 (这里就是举个列子 请读者自行修改)
public static void setCode(Address record,ExecutorService executorService){
if(StringUtils.notBlank(record.getLng())&&StringUtils.notBlank(record.getLat())){
executorService.execute(new Runnable() {
@Override
public void run() {
try {
Map<String, Object> position = AddressUtil.getPosition(record.getLng(), record.getLat(), null, null, null);
if(position!=null){
Map data = (Map)position.get("data");
//更新对应数据信息
//nation_name 国家名称(中国) nation_code-国家编码(我自定义的为:000000)
//province_name 省名称 province_code省编码
String provinceName=data.get("shortname").toString().replaceAll("\"","");
String provinceCode=data.get("parentid").toString();
//city_name 地市名称 city_code 地市编码
String cityName=data.get("areaname").toString().replaceAll("\"","");
String cityCode=data.get("id").toString();
//county_name 县/区域名称 county_code 县/区域编码
String countyName=((Map)data.get("county")).get("areaname").toString().replaceAll("\"","");
String countyCode=((Map)data.get("county")).get("id").toString();
//更新对应数据
......
//
}
} catch (Exception e) {
logger.error("kcode转化失败:",e);
} finally {
//不成功的业务处理
}
}
});
}
}
AddressUtil 类
import com.cnksi.utils.LatAndLngUtil.IPSeeker;
import com.cnksi.utils.LatAndLngUtil.JsonUtil;
import lombok.Synchronized;
import java.util.*;
/**
* 经纬度转 地理位置(省市县)
*/
public class AddressUtil {
private static List<Map<String, Object>> list = new ArrayList();
private static Map<Integer, Map<String, Object>> map = new HashMap();
@Synchronized //lombok锁
public static Map<String, Object> getPosition(Double longitude, Double latitude, Double baseStationX, Double baseStationY, String IP)
{
Date d1 = new Date();
Map resultMap = new HashMap();
resultMap.put("code", Integer.valueOf(500));
resultMap.put("message", "失败");
Map shopAreaMap = new HashMap();
if ((longitude != null) && (latitude != null)) {
if (list.size() == 0) {
JsonUtil jsonUtil = JsonUtil.getInstance();
list = jsonUtil.readJson();
}
if (map.size() == 0) {
for (Map jsonMap : list) {
map.put(Integer.valueOf(jsonMap.get("id").toString()), jsonMap);
}
}
double num = 0.0D;
double min = 0.0D;
boolean flag=true;
for (Map areaMap : list)
{
if (!"1".equals(areaMap.get("level").toString())&&!"2".equals(areaMap.get("level").toString())&& (areaMap.get("lng") != null) && (!"".equals(areaMap.get("lng"))) && (!"null".equals(areaMap.get("lng").toString())) && (areaMap.get("lat") != null) &&
(!"".equals(areaMap.get("lat"))) && (!"null".equals(areaMap.get("lat").toString()))) {
String lng = areaMap.get("lng").toString().replace("\"", "");
String lat = areaMap.get("lat").toString().replace("\"", "");
/*num = CoordTransform.getDistance(longitude.doubleValue(), latitude.doubleValue(), Double.parseDouble(lng),
Double.parseDouble(lat)).doubleValue();*/
num = LocationUtils.getDistance(latitude,longitude, Double.parseDouble(lat), Double.parseDouble(lng));
if (min == 0.0D&&flag) {
min = num;
shopAreaMap = areaMap;
flag=false;
}else if (num < min) {
min = num;
shopAreaMap = areaMap;
}
}
}
if (shopAreaMap != null)
{
if(shopAreaMap.get("level")!=null){
int level = Integer.valueOf(shopAreaMap.get("level").toString()).intValue();
if (level == 4) {
Map parentMap = (Map)map.get(Integer.valueOf(shopAreaMap.get("parentid").toString()));
if (parentMap != null) {
Map cityMap = (Map)map.get(Integer.valueOf(parentMap.get("parentid").toString()));
if (cityMap != null)
{
shopAreaMap = cityMap;
}
shopAreaMap.put("county",parentMap);
}
}
if (level == 3) {
Map m = shopAreaMap;
Map parentMap = (Map)map.get(Integer.valueOf(shopAreaMap.get("parentid").toString()));
if (parentMap != null) {
shopAreaMap = parentMap;
}
shopAreaMap.put("county",m);
}
shopAreaMap.put("shortname", ((Map)map.get(Integer.valueOf(shopAreaMap.get("parentid").toString()))).get("areaname").toString());
}
}
resultMap.put("code", Integer.valueOf(200));
resultMap.put("message", "成功");
resultMap.put("data", shopAreaMap);
}
if ((IP != null) && (!"".equals(IP))) {
String ipInfo = IPSeeker.getAddressByCity(IP);
shopAreaMap = IPSeeker.jqCity(ipInfo);
resultMap.put("data", shopAreaMap);
resultMap.put("code", Integer.valueOf(200));
resultMap.put("message", "成功");
}
return resultMap;
}
public static void main(String[] args) {
//System.err.println(getPosition(104.391251, 31.129335, null, null, null).get("data"));
Map<String, Object> position = getPosition(103.8239234539004, 29.481175402142373, null, null, null);
Map data = (Map)position.get("data");
System.err.println("省:"+data.get("shortname"));
System.err.println("省id:"+data.get("parentid"));
System.err.println("市:"+data.get("areaname"));
System.err.println("市id:"+data.get("id"));
System.err.println("县:"+((Map)data.get("county")).get("areaname"));
System.err.println("县id:"+((Map)data.get("county")).get("id"));
/*String p="1234-9999-0909";
if(String.valueOf(p).matches("(?:[0-9]){4}-(?:[0-9]){4}-(?:[0-9]){4}")){
System.out.println("true");
}else{
System.out.println("false");
}*/
//double num = LocationUtils.getDistance(30.660275,104.103081, 30.573242, 103.922707);
//System.out.println("距离:"+num);
//System.err.println(getPosition(null, null, null, null, "219.137.148.0"));
}
}
AddressApi类
import java.util.*;
public class AddressApi
{
private static List<Map<String, Object>> list = new ArrayList();
private static Map<Integer, Map<String, Object>> map = new HashMap();
public static Map<String, Object> getPosition(Double longitude, Double latitude, Double baseStationX, Double baseStationY, String IP)
{
Date d1 = new Date();
Map resultMap = new HashMap();
resultMap.put("code", Integer.valueOf(500));
resultMap.put("message", "失败");
Map shopAreaMap = new HashMap();
if ((longitude != null) && (latitude != null)) {
if (list.size() == 0) {
JsonUtil jsonUtil = JsonUtil.getInstance();
list = jsonUtil.readJson();
}
if (map.size() == 0) {
for (Map jsonMap : list) {
map.put(Integer.valueOf(jsonMap.get("id").toString()), jsonMap);
}
}
double num = 0.0D;
double min = 0.0D;
for (Map areaMap : list)
{
if ((areaMap.get("lng") != null) && (!"".equals(areaMap.get("lng"))) && (!"null".equals(areaMap.get("lng").toString())) && (areaMap.get("lat") != null) &&
(!"".equals(areaMap.get("lat"))) && (!"null".equals(areaMap.get("lat").toString()))) {
String lng = areaMap.get("lng").toString().replace("\"", "");
String lat = areaMap.get("lat").toString().replace("\"", "");
num = CoordTransform.getDistance(longitude.doubleValue(), latitude.doubleValue