百度地圖介面

航空母艦發表於2015-10-15
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
        body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微軟雅黑";}
    </style>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的金鑰"></script>
    <title>地圖展示</title>
</head>
<body>
<div id="allmap"></div>
</body>
</html>

 點選獲取經緯度以及地址

var geoc = new BMap.Geocoder();
map.addEventListener("click", function(e){
    //通過點選百度地圖,可以獲取到對應的point, 由point的lng、lat屬性就可以獲取對應的經度緯度
    console.log(e.point.lng + ", " + e.point.lat);
    var pt = e.point;
    geoc.getLocation(pt, function(rs){
        //addressComponents物件可以獲取到詳細的地址資訊
        var addComp = rs.addressComponents;
        var site = addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber;
        //將對應的HTML元素設定值
        $("#site").val(site);
        $("#longitude").val(pt.lng);
        $("#latitude").val(pt.lat);
    });
});

 獲取兩點間距離,可以算出覆蓋區域,比如覆蓋區域10個座標和中心點算距離

<script type="text/javascript">
	// 百度地圖API功能
	var map = new BMap.Map("allmap");
	map.centerAndZoom("重慶",12);  //初始化地圖,設定城市和地圖級別。
	var pointA = new BMap.Point(106.486654,29.490295);  // 建立點座標A--大渡口區
	var pointB = new BMap.Point(106.581515,29.615467);  // 建立點座標B--江北區
	alert('從大渡口區到江北區的距離是:'+(map.getDistance(pointA,pointB)).toFixed(2)+' 米。');  //獲取兩點距離,保留小數點後兩位
	var polyline = new BMap.Polyline([pointA,pointB], {strokeColor:"blue", strokeWeight:6, strokeOpacity:0.5});  //定義折線
	map.addOverlay(polyline);     //新增折線到地圖上
</script>

3 座標轉換

我們知道,Google地圖、soso地圖與百度地圖的座標是不一樣的,通常會差挺遠一段距離。因此我們在微信中使用百度地圖導航等百度地圖API時,若 根據微信獲取的使用者位置資訊的話,得到的結果通常是不準確的。這時我們就需要把微信獲取的使用者位置座標轉換成百度地圖對應的座標才可以。百度地圖座標轉換API是一套以HTTP形式提供的座標轉換介面,用於將常用的非百度座標(目前支援GPS裝置獲取的座標、google地圖座標、soso地圖座標、amap地圖座標、mapbar地圖座標)轉換成百度地圖中使用的座標

 

圓形區域搜尋

<script type="text/javascript">
	// 百度地圖API功能
	var map = new BMap.Map("allmap"); // 建立Map例項 divid=allmap
	var mPoint = new BMap.Point(116.404, 39.915);  
	map.enableScrollWheelZoom(true); //開啟滾輪縮放
	map.centerAndZoom(mPoint,15); //座標設定為地圖中心點,縮放級別15

	var circle = new BMap.Circle(mPoint,1000,{fillColor:"blue", strokeWeight: 1 ,fillOpacity: 0.3, strokeOpacity: 0.3});
    map.addOverlay(circle);
    var local =  new BMap.LocalSearch(map, {renderOptions: {map: map, autoViewport: false}});  
    local.searchNearby('餐館',mPoint,1000);
</script>
百度地圖Web服務API為開發者提供http介面,即開發者通過http形式發起檢索請求,獲取返回json或xml格式的檢索資料。
geolocation的位置資訊來源包括GPS、IP地址、RFID、WIFI和藍芽的MAC地址、以及GSM/CDMS的ID等等。規範中沒有規定使用這些裝置的先後順序,在HTML5的實現中,手機等移動裝置當然優先使用GPS定位,而筆記本和部分平板,最準的定位是WIFI,至於網線上網的桌上型電腦,一般就只能使用IP來定位了,這個準確度最低。
<?php
/**
 * @desc 根據兩點間的經緯度計算距離 輸出距離/米
 * @param float $lat 緯度值
 * @param float $lng 經度值
 */
function getDistance($lat1, $lng1, $lat2, $lng2)
{
    $earthRadius = 6378138; //近似地球半徑米
    $lat1 = ($lat1 * pi()) / 180;
    $lng1 = ($lng1 * pi()) / 180;
    $lat2 = ($lat2 * pi()) / 180;
    $lng2 = ($lng2 * pi()) / 180;
    $calcLongitude = $lng2 - $lng1;
    $calcLatitude = $lat2 - $lat1;
    $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);
    $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
    $calculatedDistance = $earthRadius * $stepTwo;
    return round($calculatedDistance);
}
/**
 *計算某個經緯度的周圍某段距離的正方形的四個點
 *
 * @param lng float 經度
 * @param lat float 緯度
 * @param distance float 該點所在圓的半徑,該圓與此正方形內切,預設值為0.5千米
 * @return array 正方形的四個點的經緯度座標
 */
public function returnSquarePoint($lng, $lat, $distance = 0.5) {
    $earthRadius = 6378.138; //近似地球半徑km
    $dlng = 2 * asin(sin($distance / (2 * $earthRadius)) / cos(deg2rad($lat)));
    $dlng = rad2deg($dlng);
    $dlat = $distance / $earthRadius;
    $dlat = rad2deg($dlat);
    return array(
        'left-top' => array('lat' => $lat + $dlat, 'lng' => $lng - $dlng),
        'right-top' => array('lat' => $lat + $dlat, 'lng' => $lng + $dlng),
        'left-bottom' => array('lat' => $lat - $dlat, 'lng' => $lng - $dlng),
        'right-bottom' => array('lat' => $lat - $dlat, 'lng' => $lng + $dlng)
    );
}
//計算實體建築與當前座標的距離,按距離升序
function calculationEntitiesFromLocation($local_x, $local_y)
{
    foreach ($results as $info) {
        $distance = getDistance($local_x, $local_y, $info->lat, $info->lng);
        $shopSortArrays[$distance] = $info;
    }
    ksort($shopSortArrays); //排序
    return $shopSortArrays;
}

 

百度地圖API地理位置和座標轉換

1.由地名(省份、城市、街道等)得到其對應的百度地圖座標:

http://api.map.baidu.com/geocoder/v2/?output=json&ak=你從百度申請到的Key&address=北京市

2.由座標反解得到對應的地址:http://api.map.baidu.com/geocoder/v2/?output=json&ak=你從百度申請到的Key&location=緯度(Latitude),經度(Longitude)

function geoCoder() {
    marker.setPosition(point);
    var send = {
        ak: "{:C('BAIDU_MAP_AK')}",
        location: point.lat + ',' + point.lng,
        output: 'json',
        pois: 1
    };
    $.ajax({
        url: 'http://api.map.baidu.com/geocoder/v2/',
        dataType: 'jsonp',
        data: send,
        success: function (data) {
            if (data.status == 0 && data.result) {
                var pois = data.result.pois;
                addressList = pois;
                makeList(pois);
            }
        }
    })
}

$squares = $this->returnSquarePoint($latitude, $longitude, 5);
//查詢範圍內的座標
"where latitude between {$squares['right-bottom']['lat']} and {$squares['left-top']['lat']} and longitude between {$squares['left-top']['lng']} and {$squares['right-bottom']['lng']}";

 
 

 
 
 

相關文章