java 根据经纬度获取地理位置信息(省、市、县、乡镇)-没有外网

场景:
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
  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
可以使用 Google Maps API 来获取地址信息。首先需要去 Google Cloud Platform 注册账号并获取 API 密钥,然后就可以使用 Java 语言调用 Google Maps API 来根据经纬度获取地址信息了。 具体地,可以使用 Java 的 HttpURLConnection 类来发送 HTTP 请求,然后解析响应内容就可以得到地址信息。例如,以下代码展示了如何调用 Google Maps API 来根据经纬度获取地址信息: ``` import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class Main { public static void main(String[] args) throws Exception { // 经纬度坐标 double lat = 39.9042; double lng = 116.4074; // 调用 Google Maps API 获取地址信息 String key = "YOUR_API_KEY"; String url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" + lat + "," + lng + "&key=" + key; HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setRequestMethod("GET"); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; StringBuilder result = new StringBuilder(); while ((line = in.readLine()) != null) { result.append(line); } in.close(); // 解析响应内容获取地址信息 // TODO: 具体实现略 } } ``` 这段代码中,我们使用 HttpURLConnection 类发送了一个 HTTP GET 请求,请求的 URL 中包含了经纬度坐标和 API 密钥。当服务器响应请求后,我们使用 BufferedReader 读取响

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值