`

根据经纬度查询附近的点

 
阅读更多
大致思想:根据给定经纬度(lat,lng)求出其左上角(left_top),右上角(right_top),左下角(left_bottom),右下角(right_bottom)的四个位置。所有在这个区域的范围都在该点附近。
参照:http://blog.charlee.li/location-search/

java代码:
package com.show.common.util;

public class Location {
	private double latitude;
	private double longitude;

	public Location(double latitude, double longitude) {
		this.latitude = latitude;
		this.longitude = longitude;
	}

	public double getLatitude() {
		return latitude;
	}

	public void setLatitude(double latitude) {
		this.latitude = latitude;
	}

	public double getLongitude() {
		return longitude;
	}

	public void setLongitude(double longitude) {
		this.longitude = longitude;
	}

}

package com.show.common.util;

public class LatitudeLontitudeUtil {

	// http://blog.charlee.li/location-search/

	/** 地球半径 */
	private static final double EARTH_RADIUS = 6371000;
	/** 范围距离 */
	private double distance;
	/** 左上角 */
	private Location left_top = null;
	/** 右上角 */
	private Location right_top = null;
	/** 左下角 */
	private Location left_bottom = null;
	/** 右下角 */
	private Location right_bottom = null;

	private LatitudeLontitudeUtil(double distance) {
		this.distance = distance;
	}

	private void getRectangle4Point(double lat, double lng) {

		// float dlng = 2 * asin(sin(distance / (2 * EARTH_RADIUS)) / cos(lat));
		// float dlng = degrees(dlng) // 弧度转换成角度
		double dlng = 2 * Math.asin(Math.sin(distance / (2 * EARTH_RADIUS))
				/ Math.cos(lat));
		dlng = Math.toDegrees(dlng);

		// dlat = distance / EARTH_RADIUS
		// dlng = degrees(dlat) # 弧度转换成角度
		double dlat = distance / EARTH_RADIUS;
		dlat = Math.toDegrees(dlat); // # 弧度转换成角度

		// left-top : (lat + dlat, lng - dlng)
		// right-top : (lat + dlat, lng + dlng)
		// left-bottom : (lat - dlat, lng - dlng)
		// right-bottom: (lat - dlat, lng + dlng)
		left_top = new Location(lat + dlat, lng - dlng);
		right_top = new Location(lat + dlat, lng + dlng);
		left_bottom = new Location(lat - dlat, lng - dlng);
		right_bottom = new Location(lat - dlat, lng + dlng);

	}

	public static double hav(double theta) {
		double s = Math.sin(theta / 2);
		return s * s;
	}

	public static double getDistance(double lat0, double lng0, double lat1,
			double lng1) {
		// from math import sin, asin, cos, radians, fabs, sqrt

		// def hav(theta):
		// s = sin(theta / 2)
		// return s * s

		// def get_distance_hav(lat0, lng0, lat1, lng1):
		// "用haversine公式计算球面两点间的距离。"
		// # 经纬度转换成弧度
		// lat0 = radians(lat0)
		// lat1 = radians(lat1)
		// lng0 = radians(lng0)
		// lng1 = radians(lng1)

		// dlng = fabs(lng0 - lng1)
		// dlat = fabs(lat0 - lat1)
		// h = hav(dlat) + cos(lat0) * cos(lat1) * hav(dlng)
		// distance = 2 * EARTH_RADIUS * asin(sqrt(h))

		// return distance
		lat0 = Math.toRadians(lat0);
		lat1 = Math.toRadians(lat1);
		lng0 = Math.toRadians(lng0);
		lng1 = Math.toRadians(lng1);

		double dlng = Math.abs(lng0 - lng1);
		double dlat = Math.abs(lat0 - lat1);
		double h = hav(dlat) + Math.cos(lat0) * Math.cos(lat1) * hav(dlng);
		double distance = 2 * EARTH_RADIUS * Math.asin(Math.sqrt(h));

		return distance;
	}

	public static Location[] getRectangle4Point(double lat, double lng,
			double distance) {
		LatitudeLontitudeUtil llu = new LatitudeLontitudeUtil(distance);
		llu.getRectangle4Point(lat, lng);
		Location[] locations = new Location[4];
		locations[0] = llu.left_top;
		locations[1] = llu.right_top;
		locations[2] = llu.left_bottom;
		locations[3] = llu.right_bottom;
		return locations;
	}

	public static void main(String[] args) {
		double lat = 30.500;
		double lng = 120.500;
		double distance = 500d;
		Location[] locations = LatitudeLontitudeUtil.getRectangle4Point(lat,
				lng, distance);
		String sql = "SELECT * FROM place WHERE lat > "
				+ locations[2].getLatitude() + " AND lat < "
				+ locations[0].getLatitude() + " AND lng > "
				+ locations[0].getLongitude() + " AND lng < "
				+ locations[1].getLongitude();
		System.out.println(sql);

		double lat1 = 30.495503391970406;
		double lng1 = 120.49261708577215;
		double d = LatitudeLontitudeUtil.getDistance(lat, lng, lat1, lng1);
		System.out.println(d);
	}
}
分享到:
评论
2 楼 dongbiying 2014-09-11  
我找到原因啦。。。

// float dlng = 2 * asin(sin(distance / (2 * EARTH_RADIUS)) / cos(lat)); 
// float dlng = degrees(dlng) // 弧度转换成角度 
        double dlng = 2 * Math.asin(Math.sin(distance / (2 * EARTH_RADIUS)) 
                / Math.cos(lat)); 
        dlng = Math.toDegrees(dlng);

这里的公式有误!

应该是这样的:


// $dlng =  2 * asin(
// sin($distance / (2 * EARTH_RADIUS))
// /
// cos(deg2rad($lat))
// );
// $dlng = rad2deg($dlng);//转换弧度

double dlng = 2 * Math.asin(Math.sin(distance/(2*EARTH_RADIUS))/Math.cos(Math.toRadians(lat)));
dlng = Math.toDegrees(dlng);
1 楼 dongbiying 2014-09-11  
请问楼主。我现在传的值是
double lat = 39.905529;
double lng = 116.475395;
这时
double dlng = 2 * Math.asin(Math.sin(distance / (2 * EARTH_RADIUS))
/ Math.cos(lat));
dlng = Math.toDegrees(dlng);
最后 dlng 为负值

最后导致

SELECT * FROM F_LOCATION WHERE lat > 39.90103239197041 AND lat < 39.91002560802959 AND lng > 116.48296916308891 AND lng < 116.4678208369111

肯定不会有结果集的呀!

请问怎么解呀。。。

相关推荐

    给定经纬度的点和距离,进行附近地点查询,计算两点位置的距离

    根据一个给定经纬度的点和距离,进行附近地点查询,计算两点位置的距离,返回两点的距离,单位:公里或千米

    根据当前坐标(经纬度)计算附近位置-java版本

    根据已知点坐标计算附近位置,代码详细解释了三种计算策略。主要涉及日常需要解决问题,例如类似于滴滴打车实现查找附近车辆业务逻辑和贝壳找房根据指定位置筛选出附近房源,上述两场场景应用可借鉴代码中两种方法...

    根据经纬度算出距离

    总的来说,通过理解和使用“根据经纬度算出距离”的Java代码,开发者可以增强自己在地理计算、坐标转换以及优化算法等方面的能力,这对于开发地图应用、物流跟踪、社交网络中的“附近的人”等功能都至关重要。

    PHP获取经纬度两点间距离,筛选,排序,多用于APP中用户与用户或用户与商家之间,进行距离筛选,排序

    PHP获取经纬度两点间距离,筛选,排序,多用于APP中用户与用户或用户与商家之间,进行距离筛选,排序

    根据经纬度查地址.zip

    在IT行业中,根据经纬度查询地址是一项常见的地理信息系统(GIS)任务,主要应用于地图服务、导航系统、位置分析等领域。这个“根据经纬度查地址.zip”压缩包文件可能包含了一个或者多个工具或程序,用于将地球表面...

    mysql函数-根据经纬度坐标计算距离

    本篇文章将详细介绍如何利用MySQL的内置函数和数学公式来计算两个经纬度坐标点之间的距离。 首先,我们需要了解地球上两点之间的距离计算方法。在地球表面上,两点间的最短距离是大圆航线(Great Circle Distance)...

    中国主要城市经纬度查询

    本文档的整理正是针对这一需求,提供了一份中国主要城市的经纬度查询资源,涵盖了从省级行政区到地级市,乃至县级市的详细坐标信息。 中国,作为一个地跨五个地理带的国家,拥有极为丰富的经纬度范围。从纬度来看,...

    PointAddress.zip_经纬度_经纬度点

    房地产平台则可以根据经纬度信息提供附近的房源推荐。 为了实现这一功能,开发者通常需要掌握以下技术: 1. 了解地理编码和反向地理编码的基本原理。 2. 掌握至少一种编程语言,如Python、Java、JavaScript等,并...

    经纬度周边半径计算

    在地理信息系统(GIS)和定位服务中,经常需要根据给定的经纬度坐标及指定的半径范围来计算出该范围内的其他坐标点。这种需求常见于地图应用、位置服务等领域。下面将详细介绍如何进行经纬度周边半径的计算。 #### ...

    地区经纬度信息获取(利用Google地图API获取)

    根据提供的文件内容,我们可以提取以下知识点: 1. Google地图API概述 Google地图API是谷歌公司提供的一个服务,允许开发者在自己的应用中嵌入谷歌地图,并通过编程的方式实现对地图服务的访问。它提供了丰富的接口...

    高德地图定位检索附近周边街道

    可以通过高德地图的逆地理编码服务将经纬度转换为具体的地址信息: ```java GeocodeQuery query = new GeocodeQuery(new LatLonPoint(latitude, longitude), "1000m"); geocodeSearch = new GeocodeSearch(this); ...

    天地图搜索及获取经纬度工具 (含大量注释对于初学很有帮助)

    总之,"天地图搜索及获取经纬度工具"是一个实用的学习资源,涵盖了地图服务调用、地理编码、前端交互等多个IT领域的知识点。通过研究源代码和实际操作,初学者可以深入理解如何利用天地图API进行地图应用开发,同时...

    使用GPS经纬度定位附近地点(某一点范围内查询)

    在IT行业中,GPS经纬度定位...总结起来,使用GPS经纬度定位附近地点需要对地理空间坐标系统、距离计算以及数据库查询有深入理解。通过C#实现的Haversine公式和适当的搜索算法,我们可以有效地找到手机用户附近的商户。

    火车站点经纬度

    例如,一个旅行者可以利用这些数据来查找目的地附近有哪些火车站,或者为特定的旅行计划选择最佳的出发和到达站点。而对于进行城市规划或交通规划的专业人士而言,这些数据则可以帮助他们更好地理解和分析铁路网络在...

    mysql优化经纬度的计算

    需求:现在移动app的运用越来越广泛了,这里有个需求就是查找我附近的酒店 或者是团购这样类似的功能 前提:一般我们的酒店都是有经纬度的 也保存在数据库中,那么我们只要在数据库查找这些就可以了 也就是说 我们...

    mongodb_整合java_dao,以及用mongodb做附近人,或者是根据经纬多获取附近商家

    “根据经纬度获取附近的商家”或“获取附近的人”涉及到地理空间查询。MongoDB支持2dsphere索引,可以用来存储和查询地理位置数据。在`findAllNear()`方法中,你需要创建一个`GeoJsonPoint`对象,构建查询条件,然后...

    用NodeJS实现批量查询地理位置的经纬度接口

    实现步骤 1、 查询接口 网站上这种类型的接口还不少,笔者直接找了百度地图的接口做,接口文档,调用的API是Geocoding API中的地理编码服务 请求示例:对北京市百度大厦进行地理编码查询 ...这里面需要一个ak参数,...

    百度地图定位获取经纬度

    6. 显示位置标记:根据获取到的经纬度,在地图上添加一个标记来表示用户的位置。 7. 处理结果:可以将这些位置信息用于各种用途,比如导航、附近搜索、位置记录等。 在实际开发中,可能会遇到一些挑战,如定位不准...

    SQL 计算经纬

    我们可以用以下SQL查询来找出所有位于用户当前位置附近一定范围内的其他用户: ```sql SELECT * FROM users WHERE SQRT( POW(ABS(latitude - :user_latitude), 2) + POW(ABS(longitude - :user_longitude), 2) )...

    高德省市区城市编码,包含经纬度

    通过编码,开发者能够高效地查询特定地区的地理信息,比如计算两点间的距离,或者根据用户位置推荐附近的兴趣点。 描述中提到的数据来源于高德地图的Web服务下载页面,其中包含了JSON和SQL两种格式的文件。JSON...

Global site tag (gtag.js) - Google Analytics