16算两个经纬度之间的距离

https://www.cnblogs.com/0201zcr/p/4673924.html

工具类:

 LLUtils

package com.air.space.service.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.commons.lang.StringUtils;


public class LLUtils {

    /**
     * 返回输入地址的经纬度坐标 key lng(经度),lat(纬度)
     */
    public static Map<String, String> getGeocoderLatitude(String address) {
        BufferedReader in = null;
        try {
            Map<String,String> paramsMap = new LinkedHashMap<String, String>();
            paramsMap.put("address", address);
            paramsMap.put("output", "json");
            paramsMap.put("ak", "tcFOTGgbPXo9NeFYTzSTpytXiOFwaKZI");
            String quest = GetLatitude.toQueryString(paramsMap);
            URL tirc = new URL(
                    "http://api.map.baidu.com/geocoder/v2/?" + quest + "&sn=" + GetLatitude.result(paramsMap));

            in = new BufferedReader(new InputStreamReader(tirc.openStream(), "UTF-8"));
            String res;
            StringBuilder sb = new StringBuilder("");
            while ((res = in.readLine()) != null) {
                sb.append(res.trim());
            }
            String str = sb.toString();
            Map<String, String> map = null;
            if (StringUtils.isNotEmpty(str)) {
                int lngStart = str.indexOf("lng\":");
                int lngEnd = str.indexOf(",\"lat");
                int latEnd = str.indexOf("},\"precise");
                if (lngStart > 0 && lngEnd > 0 && latEnd > 0) {
                    String lng = str.substring(lngStart + 5, lngEnd);
                    String lat = str.substring(lngEnd + 7, latEnd);
                    map = new HashMap<String, String>();
                    map.put("lng", lng);
                    map.put("lat", lat);
                    return map;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }


}

GetDistanceUtils

package com.air.space.service.util;

import java.math.BigDecimal;
import java.util.Map;

public class GetDistanceUtils{
	
	
	/**
	 * Calculate latitude and longitude by an address,
	 * Calculate the distance between two positions by latitude and longitude
	 * @param place
	 * @return
	 */
	public static Double getDistance(String place1,String place2){
		Map<String,String> geocoderLatitude1 = LLUtils.getGeocoderLatitude(place1);
		double lat1 = Double.parseDouble(geocoderLatitude1.get("lat"));
		double lng1 = Double.parseDouble(geocoderLatitude1.get("lng"));
		Map<String,String> geocoderLatitude2 = LLUtils.getGeocoderLatitude(place2);
		double lat2 = Double.parseDouble(geocoderLatitude2.get("lat"));
		double lng2 = Double.parseDouble(geocoderLatitude2.get("lng"));
		double s1 = LocationUtils.getDistance(lat1, lng1, lat2, lng2);
		double distance = new BigDecimal(s1).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
		return distance;
	}
	
	
	
	
}

根据两个地方的地址,可以求出两地的距离:

例如 数据库中村的地方是: 金台夕照财富中心三层

        你所在的位置: 国贸

       根据调用GetDistanceUtils 可求得两者距离

 

应用:

传入的参数是:

访问地址:http://118.89.225.162:8114/air-api/space/querySpaceNoQuery

接口说明:无条件无分页业主空间列表查询

输入参数:

变量名称

变量命名

变量类型

是否必填

示例

说明

类型

type

Integer

 

type=2 App  安卓

当前位置

place

String

 

 

@RequestMapping(value = "/querySpaceNoQuery",method = RequestMethod.POST,
				produces = MediaType.APPLICATION_JSON_VALUE)
	public List<Space> querySpaceNoQuery(@RequestBody SpaceQuery spaceQuery){
		return this.spaceService.querySpaceNoQuery(spaceQuery);
	}

 

public List<Space> querySpaceNoQuery(SpaceQuery spaceQuery) {
		List<Space> list = this.spaceRepository.findAll();
		
		Integer type = spaceQuery.getType();
		String place = spaceQuery.getPlace();
		//若type==2,app和pad请求,包含距离
		if(2==type){
			for (Space space : list) {
				Double distance = (StringUtils.isBlank(place))?0.00:GetDistanceUtils.getDistance(place, space.getAddress());
				space.setDistance(distance);
			}
		}
		//进行排序
		return this.spaceRepository.findSpaceListForSort();
	}
@Query(value="SELECT * FROM table_space s where s.auth_status !='1' ORDER BY distance ASC,name ASC",nativeQuery=true)
	List<Space> findSpaceListForSort();
	

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值