PHP版根据经纬度和半径计算出经纬度的范围

2019-03-27 01:03|来源: 网路

百度地图提供了范围搜索的功能,但是它使用的是百度自己的数据,但是有时候我们需要使用自己的数据,显示在地图上。比如给定两个参数:指定位置(某一处的经纬度lnglat)和搜索半径(r),搜索指定范围内的数据。针对这样的需求,基本有三种方法可以解决:
1:根据map提供的计算两个坐标之间距离的方法,逐一计算指定位置和我们DB库中的位置的距离s,用s和r进行比较,如果s<r,则在搜索范围内,返给前段标注在地图上。这种方法如果数据量小,可以尝试,如果数据量大,没测试过,但可以想象……

2:使用搜索引擎自带的功能,比如solr的位置感知搜索,可参看文章http://www.ibm.com/developerworks/cn/java/j-spatial/

3:如果对精度要求不是很高,可以根据指定位置的经纬度和半径计算出经纬度的范围,然后判断DB中的经纬度是否在此范围内,可用SQL进行查询。下面是此计算方法:

/**
* @param lat 纬度 lon 经度 raidus 单位米
* return minLat,minLng,maxLat,maxLng
*/

public function getAround($lat,$lon,$raidus){
$PI = 3.14159265;

$latitude = $lat;
$longitude = $lon;

$degree = (24901*1609)/360.0;
$raidusMile = $raidus;

$dpmLat = 1/$degree;
$radiusLat = $dpmLat*$raidusMile;
$minLat = $latitude$radiusLat;
$maxLat = $latitude + $radiusLat;

$mpdLng = $degree*cos($latitude * ($PI/180));
$dpmLng = 1 / $mpdLng;
$radiusLng = $dpmLng*$raidusMile;
$minLng = $longitude$radiusLng;
$maxLng = $longitude + $radiusLng;
echo $minLat.”#”.$maxLat.”@”.$minLng.”#”.$maxLng;
}
本文固定链接: http://www.ccsbbs.com.cn/archives/4686.html
转自:http://www.cnblogs.com/tyjsjl/p/3799465

相关问答

更多
  • 北纬N22°49′19.17″ 东经E114°24′54.54″ 靠近:惠州市秋长镇维布村 参考:广东省惠州市惠阳区秋长街道维布村东南方向
  • 经纬度信息一般不怎么变化,可以先放到redis中去建立索引,后面app端直接查询缓存就可以了,比较快!
  • MaxMind Geolite城市是免费的 。 如果它不够好,你显然可以升级到更准确的付费版本。 我不能说付费版本的质量,因为我从来没有使用它。 如果你喜欢你的SQL,请下载CSV版本 。 将其加载到您选择的数据库中,然后查询。 更快速和节省空间的选择是下载相同数据库的文件二进制blob版本 ,然后使用C#类来查询它。 另外,我发现ipinfodb.com是有用的。 查询是通过简单的HTTP GET。 例如,要geolocate stackoverflow.com尝试: http://ipinfodb.co ...
  • 您可以使用Google GeoCoding服务将地址转换为一组坐标。 例如,您可以致电地址: http://maps.googleapis.com/maps/api/geocode/xml?address=Hafeez+center,Lahore,Punjab,Pakistan&sensor=false 我的建议是做类似的事情: var responseDocument = XDocument.Load("http://maps.googleapis.com/maps/api/geocode/xml?add ...
  • 有一个名为heatmap.js的开源库可能适合你。 它基于HTML5,因此不适用于旧版浏览器。 他们也有一个GMaps热图覆盖 ,所以它是相当即插即用的。 There's an open source library called heatmap.js which might work for you. It's HTML5 based so won't work in older browsers though. They also have a GMaps Heatmap Overlay, so it' ...
  • 我认为您正在寻找的是全球定位系统,通常也称为GPS。 一些好的品牌设备是Garmin和TomTom。 如果您想通过Android手机或iOS设备使用涉及GSM,Wi-Fi,手机信号塔等的策略来查找您的位置。以下是一些链接: Android位置策略: http : //developer.android.com/guide/topics/location/strategies.html iOS核心位置: http : //www.iosdevnotes.com/2011/10/ios-corelocation ...
  • 为你的情况尝试使用WHERE而不是HAVING SELECT *, (3959 * acos(cos(radians('".$lat."')) * cos(radians(lat)) * cos( radians(long) - radians('".$lng."')) + sin(radians('".$lat."')) * sin(radians(lat)))) AS distance FROM carpark WHERE distance < 15 ORDER BY distance LIMIT ...
  • CLLocationManager是您必须使用的接口,以获取有关设备位置的信息。 您可以随时初始化并开始获取位置更新。 只要收到新位置,CLLocationManager就会通知您的代理人。 locationManager = [[CLLocationManager alloc] init]; locationManager.desiredAccuracy = kCLLocationAccuracyBest; locationManager.distanceFilter = DISTANCE_FILTE ...
  • 如果您需要给定地址的纬度和经度,可以使用google maps api https://developers.google.com/maps/documentation/javascript/ 以下是一个示例: https : //google-developers.appspot.com/maps/documentation/javascript/examples/geocoding-simple 编辑:在警告弹出窗口中显示它: var address = document.getElementById( ...