根据指定的经纬度从数据库中查询半径为500m的地点

根据指定的经纬度从数据库中查询半径为500m的地点

1.从数据库中一个个遍历查找,然后二者之间求距离比较大小,慢!

2.先过滤出经纬度范围,在比较大小

思路:首先算出“给定坐标附近500米”这个范围的坐标区域。虽然它是个,我们先找出该圆的外接正方形

根据指定的经纬度从数据库中查询半径为500m的地点_第1张图片

根据指定的经纬度从数据库中查询半径为500m的地点_第2张图片

 

具体代码实现:

 

controller:

package com.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.entity.Position;
import com.service.PositionService;


@Controller
@RequestMapping("/findPosition")
public class FindPositionController {
	
	@Autowired
	protected PositionService positionService;
	/**
	 * 根据经纬度查询某一个范围内的园区
	 * @param lng 中心的经度        如:111.111111
	 * @param lat 中心的纬度        如:111.111111
	 * @param distance 半径大小     如:0.5(半径500米)
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/List")
	public List findNeighPosition(String lng,String lat,String distance){  
		double longitude = Double.parseDouble(lng);
		double latitude = Double.parseDouble(lat);
		double dis = Double.parseDouble(distance);
        //先计算查询点的经纬度范围   
        double r = 6371;//地球半径千米  
        double dlng =  2*Math.asin(Math.sin(dis/(2*r))/Math.cos(latitude*Math.PI/180));  
        dlng = dlng*180/Math.PI;//角度转为弧度  
        double dlat = dis/r;  
        dlat = dlat*180/Math.PI;          
        double minlat =latitude-dlat;  
        double maxlat = latitude+dlat;  
        double minlng = longitude -dlng;  
        double maxlng = longitude + dlng;  
        
        List list = PositionService.queryByListPosition(minlng,maxlng,minlat,maxlat);
        int len = list.size();
        System.out.println(list.size());
        //判断两点之间的距离是否大于半径
        for(int i=0;idis) {
        		list.remove(i);
        		i--;
        		len--;
        	}
        }
        System.out.println(list.size());
        return list;  
    }
	
	/**
	 * 求两点之间的距离
	 * @param lng1 A点经度
	 * @param lat1 A点纬度
	 * @param lng2 B点经度
	 * @param lat2 B点纬度
	 * @return 两点距离
	 */
	public static double getDistance(double lng1, double lat1, double lng2, double lat2) {
		double EARTH_RADIUS = 6371;
		double radiansAX = Math.toRadians(lng1); // A经弧度
		double radiansAY = Math.toRadians(lat1); // A纬弧度
		double radiansBX = Math.toRadians(lng2); // B经弧度
		double radiansBY = Math.toRadians(lat2); // B纬弧度

		// 公式中“cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2”的部分,得到∠AOB的cos值
		double cos = Math.cos(radiansAY) * Math.cos(radiansBY) * Math.cos(radiansAX - radiansBX)
				+ Math.sin(radiansAY) * Math.sin(radiansBY);
		double acos = Math.acos(cos); // 反余弦值
//		System.out.println("-------"+EARTH_RADIUS * acos);
		return EARTH_RADIUS * acos; // 最终结果
	}
}

dao

package com.dao;
import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.entity.Position;
import com.dao.BaseDao;

public interface PositionDao extends BaseDao {

	List queryByListPosition(@Param("minlng") double minlng, @Param("maxlng") double maxlng, 
			@Param("minlat") double minlat, @Param("maxlat") double maxlat);

	
}

实体Position .java

package com.entity;


public class Position {

	private double lng;	//经度
	private double lat; //纬度
	public double getLng() {
		return lng;
	}
	public void setLng(double lng) {
		this.lng = lng;
	}
	public double getLat() {
		return lat;
	}
	public void setLat(double lat) {
		this.lat = lat;
	}
}

mapper(查询语句)(select * from t_position  where lng>=? and lng <=? and lat>=? and lat<=?)

 

注意的是,第二部分的搜索范围是外接正方形,如果想只要内接圆,需要判断比较半径大小

转载来自:https://blog.csdn.net/weixin_43075298/article/details/89448491

你可能感兴趣的:(地图类)