如何在不使用Google Maps API的情况下通过PHP / CodeIgniter检查标记是否在圆半径范围内

时间:2014-11-02 21:26:58

标签: php codeigniter google-maps

我正在使用谷歌地图使用Code Igniter开发应用程序,我有一个很大的问题,即检查标记的坐标是否在存储在我的数据库中的圆的半径范围内。

我将尝试用伪代码描述,抱歉我是新手。

  1. 右击 - > Google地图上会显示一个圆圈,其中包含一个InfoBubble,您可以在其中以米为单位填写名称,颜色和圆半径;

  2. 点击保存 - >使用ajax我发送圆心,名称,颜色等

  3. 在AJAX中,我在数据库中存储有关圆圈的信息,但在注册之前,我需要设置在创建的圆弧半径内找到的标记数量。

  4. 我搜索过并找到了这个链接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;
    }
    

    谢谢!

1 个答案:

答案 0 :(得分:4)

让我给你一些在Javascript中计算的代码;所有这些都在谷歌地图代码中,但计算距离的功能只是一个功能,而不是一项服务。 (我不知道谁写了这个函数)

你的问题是拥有PHP功能,对吧?毫无疑问,您可以将javascript函数转换为PHP;或者您只是相信javascript中的计算并使用Ajax发送该结果。

代码绘制一个圆(中心=布鲁塞尔;半径= 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>