如何在不使用谷歌地图API的情况下,通过PHP/CodeIgniter检查标记是否在圆半径内


How to check if markers are within circle radius without using Google Maps API, through PHP / CodeIgniter

我正在使用谷歌地图开发一个使用Code Igniter的应用程序,并且我在检查标记的坐标是否在存储在数据库中的圆的半径内这一功能上遇到了一个大问题。

我会尝试用伪代码来描述,很抱歉我是个新手。

  1. 右键单击->谷歌地图上会出现一个带有InfoBubble的圆圈,您可以在其中填写名称、颜色和圆圈半径(以米为单位);

  2. 点击保存->使用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;
}

谢谢!

让我用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>