2014-11-02 43 views
0

我正在使用Google Maps開發一個使用Code Igniter的應用程序,並且遇到一個很大的問題,那就是檢查一個函數的協調標記在存儲在我的數據庫中的圓的半徑內。如何通過PHP/CodeIgniter檢查標記是否在圓半徑範圍內,而不使用Google Maps API

我會嘗試用僞代碼描述,對不起,我是菜鳥。

  1. 右鍵 - >在Google地圖上出現一個圓圈,其中包含InfoBubble,其中您以米爲單位填寫名稱,顏色和圓半徑;

  2. 點擊save->使用AJAX我送圓心,名稱,顏色等

  3. 在AJAX我在數據庫中存儲約圈子中的信息,但在註冊之前,我需要設置在創建的圓的半徑內找到的標記數量。

我已經搜索到,發現這個鏈接http://www.movable-type.co.uk/scripts/latlong.html,但我的數學不是很好。

我需要一個函數,它取得圓形,標記座標和半徑,並且如果標記在圓內或不在圓內,則返回true或false。

我做的東西,我發現過網,但它不工作

public function arePointsNear($checkPoint, $centerPoint, $km) { 
    $km = $km * 1000; 
    $ky = 40000/360; 
    $kx = cos(pi() * $centerPoint->lat/180.0) * $ky; 
    $dx = abs($centerPoint->lng - $checkPoint->lng) * $kx; 
    $dy = abs($centerPoint->lat - $checkPoint->lat) * $ky; 

    return sqrt($dx * $dx + $dy * $dy) <= $km; 
} 

謝謝!

回答

3

讓我給你的代碼,計算在Javascript中;所有這一切都在Google地圖代碼中進行,但計算距離的功能僅僅是一項功能,而不是一項服務。 (我不知道是誰寫的功能)

你的問題是有一個PHP函數,對不對?毫無疑問,您可以將JavaScript函數轉換爲PHP;或者你只需​​要相信javascript中的計算並使用Ajax發送結果。

該代碼繪製了一個Circle(center = Brussels; radius = 30km)和4個標記。你可以拖動它們全部。 點擊按鈕觸發計算。 我通過將標記轉爲綠色或紅色來顯示結果。

(你知道如何從這裏接手?)

<style> 
    #map-canvas { 
    height: 400px; 
    margin: 0px; 
    padding: 0px; 
    } 
</style> 
<div id="map-canvas"></div> 
<input type="button" id="start" value="Click"> 
<p>Drag the circle, drag the markers; when you click the button it will calculate if the markers are in the circle</p> 

<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?"></script> 
<script> 
    function initialize() { 
    // settings 
    var center = new google.maps.LatLng(50.84546, 4.357112); 
    var radius_circle = 30000; // 30km 
    var markerPositions = [ 
     {lat: 50.940749, lng: 4.2033035}, 
     {lat: 50.791671, lng: 4.587825}, 
     {lat: 50.66649, lng: 3.945124}, 
     {lat: 50.429139, lng: 4.813044} 
    ]; 

    var markers=[]; 
    // draw map 
    var mapOptions = { 
     center: center, 
     zoom: 8, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); 
    var circle = drawCircle(mapOptions.center, radius_circle); 

    // markers 
    for (var i=0; i<markerPositions.length; i++) { 
     markers.push(
     new google.maps.Marker({ 
      position: new google.maps.LatLng(markerPositions[i].lat, markerPositions[i].lng), 
      map: map, 
      draggable: true 
     }) 
    ); 
    } 

    // client clicks on button, we will check for the markers within the circle 
    google.maps.event.addDomListener(document.getElementById('start'), 'click', function() { 
     for (var i=0; i<markerPositions.length; i++) { 
     var distance = calculateDistance(
      markers[i].getPosition().lat(), 
      markers[i].getPosition().lng(), 
      circle.getCenter().lat(), 
      circle.getCenter().lng(), 
      "K" 
     ); 
     if (distance * 1000 < radius_circle) { // radius is in meter; distance in km 
      markers[i].setIcon('http://maps.gstatic.com/mapfiles/icon_green.png');  // make or find a better icon 
     } 
     else { 
      markers[i].setIcon('http://maps.gstatic.com/mapfiles/icon.png');   // make or find a better icon 
     } 
     } 
    }); 

    function drawCircle(center, radius) { 
     return new google.maps.Circle({ 
     strokeColor: '#0000FF', 
     strokeOpacity: 0.7, 
     strokeWeight: 1, 
     fillColor: '#0000FF', 
     fillOpacity: 0.15, 
     draggable: true, 
     map: map, 
     center: center, 
     radius: radius 
     }); 
    } 

    function calculateDistance(lat1, lon1, lat2, lon2, unit) { 
     var radlat1 = Math.PI * lat1/180; 
     var radlat2 = Math.PI * lat2/180; 
     var radlon1 = Math.PI * lon1/180; 
     var radlon2 = Math.PI * lon2/180; 
     var theta = lon1-lon2; 
     var radtheta = Math.PI * theta/180; 
     var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta); 
     dist = Math.acos(dist); 
     dist = dist * 180/Math.PI; 
     dist = dist * 60 * 1.1515; 
     if (unit=="K") { dist = dist * 1.609344; } 
     if (unit=="N") { dist = dist * 0.8684; } 
     return dist; 
    } 

    } 
    google.maps.event.addDomListener(window, 'load', initialize); 
</script> 
+0

非常感謝你:) – micutzuclau 2014-11-03 14:49:48

相關問題