获取指定经纬度指定范围内随机坐标

获取指定经纬度指定范围内随机坐标

/**
	 * 获取指定经纬度指定范围内随机坐标
	 * @param baseLog 经度
	 * @param baseLat 纬度
	 * @param radius 指定距离(单位:公里)
	 * @param scale Bigdecimal 保留小数
	 **/
	public static Map<String,BigDecimal> generatrRandomGps(BigDecimal baseLog, BigDecimal baseLat, Integer radius, int scale){
		BigDecimal divide = BigDecimal.valueOf(radius).multiply(BigDecimal.valueOf(1000)).divide(BigDecimal.valueOf(111300), 20, BigDecimal.ROUND_HALF_UP);
		double radisuInDegrees = divide.doubleValue();
		Random random = new Random();
		double u = random.nextFloat();
		double v = random.nextFloat();
		double w = radisuInDegrees * Math.sqrt(u);
		double t = 2 * Math.PI * v;
		double x = w * Math.cos(t);
		double y = w * Math.sin(t);
		BigDecimal longitude = baseLog.add(BigDecimal.valueOf(y)).setScale(scale,BigDecimal.ROUND_HALF_UP);
		BigDecimal latitude = baseLat.add(BigDecimal.valueOf(x)).setScale(scale,BigDecimal.ROUND_HALF_UP);
		Map<String,BigDecimal> result = new HashMap<>();
		result.put("longitude",longitude);
		result.put("latitude",latitude);
		return result;
	}

	/**
	 * 根据经纬度坐标算距离
	 * @param lngOne
	 * @param latOne
	 * @param lngTwo
	 * @param latTwo
	 * @return
	 */
	public static double distance(double lngOne, double latOne, double lngTwo,  
	        double latTwo) {  
	    double a, b, R;  
	    R = 6378137; // 地球半径  
	    latOne = latOne * Math.PI / 180.0;  
	    latTwo = latTwo * Math.PI / 180.0;  
	    a = latOne - latTwo;  
	    b = (lngOne - lngTwo) * Math.PI / 180.0;  
	    double d;  
	    double sa2, sb2;  
	    sa2 = Math.sin(a / 2.0);  
	    sb2 = Math.sin(b / 2.0);  
	    d = 2  
	            * R  
	            * Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(latOne)  
	                    * Math.cos(latTwo) * sb2 * sb2));  
	    return d;  
	}  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w_yang_yu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值