java中根据经纬度怎样获取附近5km的数据?

TommyWu01 2013-06-28 07:34:27
java中根据经纬度怎样获取附近5km的数据?并返回与该经纬度的实际距离,比如2km
希望大牛提供思路或者具体实现!
数据库为mysql

数据表如下:

/*表: TestTab*/----------------------

/*列信息*/-----------

FIELD TYPE COLLATION NULL KEY DEFAULT Extra PRIVILEGES COMMENT
-------------- ------------- --------------- ------ ------ ------- -------------- ------------------------------- -------
testId INT(11) (NULL) NO PRI (NULL) AUTO_INCREMENT SELECT,INSERT,UPDATE,REFERENCES 编号
testName VARCHAR(64) utf8_general_ci NO (NULL) SELECT,INSERT,UPDATE,REFERENCES
testLongitude DOUBLE (NULL) YES (NULL) SELECT,INSERT,UPDATE,REFERENCES 经度
testLatitude DOUBLE (NULL) YES (NULL) SELECT,INSERT,UPDATE,REFERENCES 纬度
createTime DATETIME (NULL) NO (NULL) SELECT,INSERT,UPDATE,REFERENCES
...全文
1722 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
中华雪碧 2013-06-29
  • 打赏
  • 举报
回复
我的方法精确度肯定是有问题,尤其是在长距离换算时,这点我已经说过了。调用精确更高的公式即可,没觉得有难点
TommyWu01 2013-06-29
  • 打赏
  • 举报
回复
引用 6 楼 huahuagongzi9999 的回复:
[quote=引用 5 楼 gagewang1 的回复:] [quote=引用 3 楼 huahuagongzi9999 的回复:] 这样不对吧?
why?[/quote] 看看下面我写的存储过程吧,我觉得这种做法比较正确,不过有语法错误,您可以copy到数据库看看原因
#-----------------------------------------------------------------------------
#获取某经纬度附近5km的用户信息
DROP PROCEDURE IF EXISTS pro_getNearUser
CREATE PROCEDURE pro_getNearUser(IN mylon DOUBLE,IN mylat DOUBLE,IN beginId INT,IN counts INT,IN dist INT)  
BEGIN  
DECLARE mylon DOUBLE;  DECLARE mylat DOUBLE;   
DECLARE lon1 FLOAT;  DECLARE lon2 FLOAT; 
DECLARE lat1 FLOAT; DECLARE lat2 FLOAT;  
-- calculate lon and lat for the rectangle:
SET lon1 = mylon-dist/ABS(COS(RADIANS(mylat))*69);  
SET lon2 = mylon+dist/ABS(COS(RADIANS(mylat))*69); 
SET lat1 = mylat-(dist/69);   
SET lat2 = mylat+(dist/69);
-- run the query:
SELECT  merchantId,
3956 * 2 * ASIN(SQRT(  POWER(SIN((orig.userLon - dest.userLat) * PI()/180 / 2), 2) +  
COS(orig.userLat * PI()/180) *  COS(dest.userLat * PI()/180) *  POWER(SIN((orig.userLon -dest.userLon) * PI()/180 / 2), 2)  )) AS
distance FROM  users dest,  users orig 
WHERE  dest.userLon BETWEEN lon1 AND lon2  
AND  dest.userLon BETWEEN lat1 AND lat2 
HAVING distance < dist ORDER BY distance LIMIT beginId,counts;  
END
#--------------------------------------------------------------------------------

[/quote] 以上存储过程针对的不是TestTab表,而是用户表。
TommyWu01 2013-06-29
  • 打赏
  • 举报
回复
引用 5 楼 gagewang1 的回复:
[quote=引用 3 楼 huahuagongzi9999 的回复:] 这样不对吧?
why?[/quote] 看看下面我写的存储过程吧,我觉得这种做法比较正确,不过有语法错误,您可以copy到数据库看看原因
#-----------------------------------------------------------------------------
#获取某经纬度附近5km的用户信息
DROP PROCEDURE IF EXISTS pro_getNearUser
CREATE PROCEDURE pro_getNearUser(IN mylon DOUBLE,IN mylat DOUBLE,IN beginId INT,IN counts INT,IN dist INT)  
BEGIN  
DECLARE mylon DOUBLE;  DECLARE mylat DOUBLE;   
DECLARE lon1 FLOAT;  DECLARE lon2 FLOAT; 
DECLARE lat1 FLOAT; DECLARE lat2 FLOAT;  
-- calculate lon and lat for the rectangle:
SET lon1 = mylon-dist/ABS(COS(RADIANS(mylat))*69);  
SET lon2 = mylon+dist/ABS(COS(RADIANS(mylat))*69); 
SET lat1 = mylat-(dist/69);   
SET lat2 = mylat+(dist/69);
-- run the query:
SELECT  merchantId,
3956 * 2 * ASIN(SQRT(  POWER(SIN((orig.userLon - dest.userLat) * PI()/180 / 2), 2) +  
COS(orig.userLat * PI()/180) *  COS(dest.userLat * PI()/180) *  POWER(SIN((orig.userLon -dest.userLon) * PI()/180 / 2), 2)  )) AS
distance FROM  users dest,  users orig 
WHERE  dest.userLon BETWEEN lon1 AND lon2  
AND  dest.userLon BETWEEN lat1 AND lat2 
HAVING distance < dist ORDER BY distance LIMIT beginId,counts;  
END
#--------------------------------------------------------------------------------

中华雪碧 2013-06-29
  • 打赏
  • 举报
回复
引用 3 楼 huahuagongzi9999 的回复:
这样不对吧?
why?
TommyWu01 2013-06-29
  • 打赏
  • 举报
回复
高手呢?这问题不难吧?
TommyWu01 2013-06-29
  • 打赏
  • 举报
回复
引用 2 楼 gagewang1 的回复:
[quote=引用 1 楼 gagewang1 的回复:]

select * from table_name where ((testLongitude-myLongitude)*(testLongitude-myLongitude)+(testLatitude-Latitude)*(testLatitude-Latitude))*value<=25

select * from table_name where ((testLongitude-myLongitude)*(testLongitude-myLongitude)+(testLatitude-myLatitude)*(testLatitude-myLatitude))*value<=25
--myLongitude,myLatitude是中心的坐标,value是经纬度差换算成距离km的数值,没有研究过,我认为距离比较近,精度要求不高的情况下是可以这样算的
[/quote] 这样不对吧?
中华雪碧 2013-06-28
  • 打赏
  • 举报
回复
引用 1 楼 gagewang1 的回复:

select * from table_name where ((testLongitude-myLongitude)*(testLongitude-myLongitude)+(testLatitude-Latitude)*(testLatitude-Latitude))*value<=25

select * from table_name where ((testLongitude-myLongitude)*(testLongitude-myLongitude)+(testLatitude-myLatitude)*(testLatitude-myLatitude))*value<=25
--myLongitude,myLatitude是中心的坐标,value是经纬度差换算成距离km的数值,没有研究过,我认为距离比较近,精度要求不高的情况下是可以这样算的
中华雪碧 2013-06-28
  • 打赏
  • 举报
回复

select * from table_name where ((testLongitude-myLongitude)*(testLongitude-myLongitude)+(testLatitude-Latitude)*(testLatitude-Latitude))*value<=25
在论坛里看到一篇 "MapView和其它控件一起显示 " 的帖子, 那是很老的一篇帖子了, 很多朋友都说无法在android SDK 1.0上运行。既然那么多人关心,我在这里就把它重写一遍,顺便加入了一些新的功能 ,感兴趣的朋友可以看看。 第一步,当然是增加map的支持了。在Android Manifest.xml增加以下语句: 第二步, 传说的Layout: 然后, 创建一个MapViewActivity: public class MapViewActivity extends MapActivity { MapView mapView; MapController mapController; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); mapView = (MapView) findViewById(R.id.map); mapController = mapView.getController(); mapController.setZoom(15); updateView(); } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } private void updateView(){ Double lat = 31.23717*1E6; Double lng = 121.50811*1E6; GeoPoint point = new GeoPoint(lat.intValue(), lng.intValue()); mapController.setCenter(point); } } 好了,你的MapView上面就多了一个EditText了。 接着,我希望在MapView增加ZoomIn和ZoomOut的功能(鄙视一下Google ,缺省的MapView居然连这个功能都没有) 1. 在我们的Layout增加一段: Java进阶(五十)根据一个给定经纬度的点,进行附近500米地点查询–合理利用算法前沿  最近做一个项目:需要查询一个站点(已知该站点经纬度)1km-10km范围内的其它站点。所以,我首先想到的是,对每条记录,去进行遍历,跟数据的每一个点进行距离计算,当距离小于10km时,认为匹配。这样做确实能够得到结果,但是效率极其低下,因为每条记录都要去循环匹配n条数据,其消耗的时间可想而知。   于是我

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧