【问题标题】:Marker on Point in polygon not displaying多边形中点上的标记不显示
【发布时间】:2014-09-05 14:05:44
【问题描述】:

我想像我遵循的这个例子一样在多边形内显示标记。

Point in polygon

但是标记没有出现。我认为我的代码中缺少,这是我保存到数据库中的坐标。

53.198524,-105.762383
53.198566,-105.765083
53.199001,-105.762314
53.199394,-105.765083
53.199409,-105.765091
53.199421,-105.762123
53.199425,-105.763580

我很感激有人可以帮助我弄清楚如何完成这项工作。

        var map;
        var polySides = 7;
        var polyLat  = new Array();

        polyLat[0]=53.198524;
        polyLat[1]=53.198566;
        polyLat[2]=53.199001;
        polyLat[3]=53.199394;
        polyLat[4]=53.199409;
        polyLat[5]=53.199421;
        polyLat[6]=53.199425;
        polyLat[7]=53.198524;


        var polyLng =  new Array();

        polyLng[0]=-105.762383;
        polyLng[1]=-105.765083;
        polyLng[2]=-105.762314;
        polyLng[3]=-105.765083;
        polyLng[4]=-105.765091;
        polyLng[5]=-105.762123;
        polyLng[6]=-105.763580;
        polyLng[7]=-105.762383;



        var maxLat = Math.max.apply(null,polyLat);
        var minLat = Math.min.apply(null,polyLat);
        var maxLng = Math.max.apply(null,polyLng);
        var minLng = Math.min.apply(null,polyLng);

        var bounds = new google.maps.LatLngBounds;
      function initialize() {

            initial = new google.maps.LatLng(53.199246241276875,-105.76864242553711);

            var mapOptions = {
                zoom: 16,
                center: initial,
                zoomControl: true,
                zoomControlOptions: {
                    style: google.maps.ZoomControlStyle.LARGE
                },
                mapTypeControl: false


            };
            map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);

        }



    $(function () {
            $.ajax({
                  type:'post',
                  dataType:'json',
                  data:'maxLat='+maxLat +'&minLat='+minLat +'&maxLng='+maxLng +'&minLng='+minLng,
                  url:'polygeofence.php',
                  success: function(data){

                      bounds  = new google.maps.LatLngBounds();
                      $.each(data,function(i,dat){

                                 if (pointInPolygon(polySides,polyLat,polyLng,dat.lat,dat.lng)){
                                       var latlng = new google.maps.LatLng(parseFloat(dat.lat),parseFloat(dat.lng));

                                      addMarker(latlng);
                                      bounds.extend(latlng);

                                  }

                      });
                      map.fitBounds(bounds);

                  }

            });
        });


     function pointInPolygon(polySides,polyX,polyY,x,y) {
            var j = polySides-1 ;
            oddNodes = 0;
            for (i=0; i<polySides; i++) {
                if (polyY[i]<y && polyY[j]>=y  ||  polyY[j]<y && polyY[i]>=y) {
                    if (polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x)  {
                        oddNodes=!oddNodes;
                    }
                }
                j=i;
            }

            return oddNodes;
        }

     function addMarker(latlng){
            marker = new google.maps.Marker({
                position: latlng,
                map: map,
                draggable: false

            });
          marker.setMap(map);
     }







        google.maps.event.addDomListener(window, 'load', initialize);

php代码

   $minlat = $_POST['minLat'];
   $maxlat = $_POST['maxLat'];
   $minlng = $_POST['minLng'];
   $maxlng = $_POST['maxLng'];

   $queryresult = mysql_query("SELECT * FROM geofencetbl WHERE
                    (lat>='$minlat' AND lat<='$maxlat')
                    AND (lng>='$minlng' AND lng<='$maxlng')
                  ");






 $results = array(
      'lat' => array(),
      'lng' => array(),
  );

  while($row=mysql_fetch_array($queryresult,MYSQL_BOTH)){
      $results['lat'][] =$row['lat'];
      $results['lng'][] =$row['lng'];


  }




   echo  json_encode($results);

编辑:编辑我的代码后,我的成功有问题 dat.lat 和 dat.lng 未定义

【问题讨论】:

  • 我猜我会说您通过 AJAX 收到的坐标被 Javascript 视为字符串。 Google Maps 期望传递给 LatLng 构造函数的值是数字。尝试将它们包装在 parseFloat 中:var latlng = new google.maps.LatLng(parseFloat(dat.lat), parseFloat(dat.lng));
  • @duncan,我尝试了你的解决方案,但仍然没有标记显示
  • 如果你在console.log(latlng) 中使用addMarker() 函数呢?
  • @MrUpsidown, lat ["53.199394", "53.198566", "53.199409", 2 更多...] 0 "53.199394" 1 "53.198566" 2 "53.199409" 3 "53.199425" 4 "53.1909 " lng ["-105.765083", "-105.765083", "-105.765091", 2 更多...] 0 "-105.765083" 1 "-105.765083" 2 "-105.765091" 3 "-105.763580" 4 "-105.762314" /跨度>
  • @MrUpsidown,我在 console.log(latlng) 中只有 7 lat 和 7 lng

标签: php jquery google-maps-api-3


【解决方案1】:

您的代码中有很多问题。您缺少许多变量声明和其他内容。

我这样评论了我的大部分更改:

// missing bounds object here
var bounds = new google.maps.LatLngBounds();

我删除了 AJAX 部分,因为它当然不起作用。我只是在创建一个标记。没有多边形。但至少这表明您将正确的 LatLng 对象传递给 addMarker() 函数。

希望这会有所帮助!

JSFiddle demo

编辑:

这是您应该如何创建 JSON 输出的方法。

$sql = "SELECT * FROM geofencetbl WHERE (lat>='$minlat' AND lat<='$maxlat') AND (lng>='$minlng' AND lng<='$maxlng')";

$result = $db->query($sql) or die($db->error);

while ($obj = $result->fetch_object()) {

    $results[] = $obj;
}

echo json_encode($results);

那么在你的AJAX成功函数中,登录dat你就应该明白怎么处理了!

【讨论】:

  • ajax的响应是这样的,lat ["53.199394", "53.198524", "53.198566", 4 more...] lng ["-105.765083", "-105.762383", "- 105.765083",还有 4 个...]
  • 我的 dat.lat 在我的成功 ajax 中未定义
  • 我在 $.each(data.marker,function(i,dat) 这样的数据上放置了标记,地图加载但没有标记显示
  • var latlng = new google.maps.LatLng(dat.lat[i],dat.lng[i]); 呢?
  • 我把 console.log("latlng",latlng); 但它没有执行,我也删除了 data.marker,因为 jquery 会得到错误“a is undefined”,所以我得到回到 $.each(data.marker,function(i,dat)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 2017-08-16
  • 2013-08-24
相关资源
最近更新 更多