Javascript 查找所选位置的最近标记Google Maps API?

Javascript 查找所选位置的最近标记Google Maps API?,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,我需要突出显示我在文本框中输入的位置的所有最近标记。我正在通过我的KML上传标记。但问题是 我可以突出显示该区域,但标记不会突出显示 。请找到我尝试过的代码 <!DOCTYPE html> <html> <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> <meta charset="utf-8"> <

我需要突出显示我在文本框中输入的位置的所有最近标记。我正在通过我的KML上传标记。但问题是

我可以突出显示该区域,但标记不会突出显示

。请找到我尝试过的代码

   <!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>test123</title>
    <link href="https://developers.google.com/maps/documentation/javascript/examples/default.css" rel="stylesheet">
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/src/markerclusterer.js"></script>
<script type="text/javascript" src="http://geoxml3.googlecode.com/svn/branches/polys/geoxml3.js"></script>
<script type="text/javascript">

        var side_bar_html = ""; 
        var marker_lat;
        var marker_lng;
        var kml;
        // arrays to hold copies of the markers and html used by the side_bar 
        // because the function closure trick doesnt work there 
        var gmarkers = []; 

       // global "map" variable
        var map = null;
        var circle = null;
        var geocoder = new google.maps.Geocoder();
        function initialize() {
            var center = new google.maps.LatLng(28.019440, -17.382813); //set map center
            var mapOptions = {
                zoom: 3, //set default zoom level
                center: center,
                mapTypeId: google.maps.MapTypeId.ROADMAP //set default map type(ROADMAP,SATELLITE,HYBRID,TERRAIN)
            };

            map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); //***ORIGINAL***
            var mcOptions = {gridSize: 50, maxZoom: 15};

            var markerclusterer = new MarkerClusterer(map, [], mcOptions);
            var infoWindow = new google.maps.InfoWindow({maxWidth: 800});

            var myParser = new geoXML3.parser({//*** ORIGINAL: only {map: map});
                map: map, singleInfoWindow: true,
                createMarker: function(placemark) {
                    //Constructing marker for each Placemark node, and then add it to the markclustere
            var point = placemark.latlng;
                    // var point = new google.maps.LatLng(placemark.point.lat, placemark.point.lng);
                    var marker = new google.maps.Marker({position: point});

                    google.maps.event.addListener(marker, "click", function() {
                        marker_lat = marker.getPosition().lat();
                        marker_lng = marker.getPosition().lng();
                        infoWindow.close();
                        infoWindow.setOptions({maxWidth: 800});
                        var content = "<strong>" + placemark.name + "</strong><br>" + placemark.description;
                        infoWindow.setContent(content);
                        infoWindow.open(map, marker);
                    });
                    markerclusterer.addMarker(marker);
                }
            });
            //kml=myParser.parse('atlanta.kml');
            myParser.parse('atlanta.kml');
        }

        function makeSidebar() {
               side_bar_html = "";
               for (var i=0; i < gmarkers.length; i++){
                 if (map.getBounds().contains(gmarkers[i].getPosition())) {
                   // add a line to the side_bar html
                   side_bar_html += '<a href="javascript:myclick(' + i + ')">' + gmarkers[i].title + '<\/a><br>';
                 }
               }
               // put the assembled side_bar_html contents into the side_bar div
               document.getElementById("side_bar").innerHTML = side_bar_html;
            }



        function codeAddress() {
            var address = document.getElementById('address').value;
            var radius = parseInt(document.getElementById('radius').value, 10)*1000;
            geocoder.geocode( { 'address': address}, function(results, status) {
              if (status == google.maps.GeocoderStatus.OK) {
                side_bar_html = "";
               // map.setCenter(results[0].geometry.location);
                var searchCenter = results[0].geometry.location;
                alert(kml);
                getNearest(kml,marker_lat,marker_lng);
                /*
                var marker = new google.maps.Marker({
                    map: map,
                    position: results[0].geometry.location
                });
                */
                if (circle) circle.setMap(null);
                circle = new google.maps.Circle({center:searchCenter,
                                                 radius: radius,
                                                 fillOpacity: 0.35,
                                                 fillColor: "#FF0000",
                                                 map: map});
                var bounds = new google.maps.LatLngBounds();
                var foundMarkers = 0;
                for (var i=0; i<gmarkers.length;i++) {
                  if (google.maps.geometry.spherical.computeDistanceBetween(gmarkers[i].getPosition(),searchCenter) < radius) {
                    bounds.extend(gmarkers[i].getPosition())
                    gmarkers[i].setMap(map);
                    // add a line to the side_bar html
                    side_bar_html += '<a href="javascript:myclick(' + i + ')">' + gmarkers[i].title + '<\/a><br>';
                    foundMarkers++;
                  } else {
                    gmarkers[i].setMap(null);
                  }
                }
                // put the assembled side_bar_html contents into the side_bar div
                //document.getElementById("side_bar").innerHTML = side_bar_html;
                if (foundMarkers > 0) {
                  map.fitBounds(bounds);
            } else {
                  map.fitBounds(circle.getBounds());
                }
                // makeSidebar();
                google.maps.event.addListenerOnce(map, 'bounds_changed', makeSidebar);

              } else {
                alert('Geocode was not successful for the following reason: ' + status);
              }
            });
          }

        var infowindow = new google.maps.InfoWindow(
                  { 
                    size: new google.maps.Size(150,50)
                  });

     // A function to create the marker and set up the event window function 
        function createMarker(latlng, name, html) {
            var contentString = html;
            var marker = new google.maps.Marker({
                position: latlng,
                // map: map,
                title: name,
                //name: name,
                zIndex: Math.round(latlng.lat()*-100000)<<5
                });

            google.maps.event.addListener(marker, 'click', function() {
                infowindow.setContent(contentString); 
                infowindow.open(map,marker);
                });
            // save the info we need to use later for the side_bar
            gmarkers.push(marker);
            // add a line to the side_bar html
            side_bar_html += '<a href="javascript:myclick(' + (gmarkers.length-1) + ')">' + name + '<\/a><br>';
        }

        function getNearest(kml, lat, lng) {
            var result = [];
            //we can easily skip document/placemark/point
            var coords = kml.getElementsByTagName('coordinates');
            for (var i=0;i<coords.length;i++) {
                var points = coords[i].textContent.split(',');
                if ((Math.abs(points[0]-lat)<0.1) && (Math.abs(points[1]-lng)<0.1)) {
                    result.push(new google.maps.LatLng(points[0], points[1]));
                }
            }
            return result;
        }



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


<body>

   <table border="1"> 
      <tr> 
        <td> 
    <div id="map-canvas" style="height:600px; width:600px"></div>
        </td> 
        <td valign="top" > 
         <!--   <div id="side_bar" style="width:300px;height:450px; text-decoration: underline; color: #4444ff; overflow:auto;"></div> --> 
        </td> 
      </tr> 
    </table> 
  <div>
      <input id="address" type="textbox" value="Atlanta">
      <input type="button" value="Geocode" onclick="codeAddress()"><br>
      <input id="radius" type="textbox" value="50"> kilometers
    </div> 
</body>
</html>

测试123
var side_bar_html=“”;
var标记;
液化天然气;
var-kml;
//数组,用于保存侧栏使用的标记和html的副本
//因为函数闭包技巧在那里不起作用
var gmarkers=[];
//全局“映射”变量
var-map=null;
var循环=空;
var geocoder=new google.maps.geocoder();
函数初始化(){
var center=new google.maps.LatLng(28.019440,-17.382813);//设置地图中心
变量映射选项={
缩放:3,//设置默认缩放级别
中心:中心,,
mapTypeId:google.maps.mapTypeId.ROADMAP//设置默认地图类型(路线图、卫星、混合、地形)
};
map=new google.maps.map(document.getElementById('map-canvas'),mapOptions);//***原始***
var mcOptions={gridSize:50,maxZoom:15};
var markerclusterer=新的markerclusterer(map,[],mcOptions);
var infoWindow=new google.maps.infoWindow({maxWidth:800});
var myParser=new geoXML3.parser({//***原始:仅{map:map});
map:map,singleInfoWindow:true,
createMarker:函数(placemark){
//为每个Placemark节点构造标记,然后将其添加到markclustere
var点=placemark.latlng;
//var point=new google.maps.LatLng(placemark.point.lat,placemark.point.lng);
var marker=new google.maps.marker({position:point});
google.maps.event.addListener(标记“单击”,函数(){
marker_lat=marker.getPosition().lat();
marker_lng=marker.getPosition().lng();
infoWindow.close();
setOptions({maxWidth:800});
var content=“”+placemark.name+”
“+placemark.description; infoWindow.setContent(content); 信息窗口。打开(地图、标记); }); markerclusterer.addMarker(标记器); } }); //kml=myParser.parse('atlanta.kml'); parse('atlanta.kml'); } 函数makeSidebar(){ 侧边_bar_html=“”; 对于(变量i=0;i'; } } //将组装好的side_bar_html内容放入side_bar div document.getElementById(“side\u bar”).innerHTML=side\u bar\u html; } 函数代码地址(){ var address=document.getElementById('address')。值; var radius=parseInt(document.getElementById('radius')。值为10)*1000; geocoder.geocode({'address':address},函数(结果,状态){ if(status==google.maps.GeocoderStatus.OK){ 侧边_bar_html=“”; //map.setCenter(结果[0].geometry.location); var searchCenter=results[0]。geometry.location; 警报(kml); 最近距离(kml、marker_lat、marker_lng); /* var marker=new google.maps.marker({ 地图:地图, 位置:结果[0]。几何体。位置 }); */ if(圆圈)circle.setMap(null); 圆圈=新的google.maps.circle({center:searchCenter, 半径:半径, 不透明度:0.35, fillColor:#FF0000“, map:map}); var bounds=new google.maps.LatLngBounds(); var=0; 对于(变量i=0;i 0){ 映射边界(bounds); }否则{ map.fitBounds(circle.getBounds()); } //makeSidebar(); google.maps.event.addListenerOnce(映射,'bounds_changed',makeSidebar); }否则{ 警报('地理编码因以下原因未成功:'+状态); } }); } var infowindow=new google.maps.infowindow( { 尺寸:新谷歌地图尺寸(150,50) }); //创建标记和设置事件窗口功能的函数 函数createMarker(latlng、name、html){ var contentString=html; var marker=new google.maps.marker({ 位置:latlng, //地图:地图, 标题:姓名, //姓名:姓名,, zIndex:Math.round(latlng.lat()*-100000)
我无法用我的眼睛解密你的代码:)我不知道事情发生的确切地点和时间。但是,我将你的KML保存为一个文件KML.KML,以模仿你收到它的方式:

$.ajax({
    url: 'kml.kml',
    success : function(kml) {
        console.log(getNearest(kml, -84.44, 33.65));
    }
});
函数
getNearest
解析KML,并返回一个
google.maps.LatLng
数组,该数组基于
lat
lng
的值,表示最近的点(接近0.1)

function getNearest(kml, lat, lng) {
    var result = [];
    //we can easily skip document/placemark/point
    var coords = kml.getElementsByTagName('coordinates');
    for (var i=0;i<coords.length;i++) {
        var points = coords[i].textContent.split(',');
        if ((Math.abs(points[0]-lat)<0.1) && (Math.abs(points[1]-lng)<0.1)) {
            result.push(new google.maps.LatLng(points[0], points[1]));
        }
    }
    return result;
}
功能最接近(kml、lat、lng){
var结果
function getNearest(kml, lat, lng) {
    var result = [];
    //we can easily skip document/placemark/point
    var coords = kml.getElementsByTagName('coordinates');
    for (var i=0;i<coords.length;i++) {
        var points = coords[i].textContent.split(',');
        if ((Math.abs(points[0]-lat)<0.1) && (Math.abs(points[1]-lng)<0.1)) {
            result.push(new google.maps.LatLng(points[0], points[1]));
        }
    }
    return result;
}
unction distance(lat1, lng1, lat2, lng2) {
        var radlat1 = Math.PI * lat1 / 180;
        var radlat2 = Math.PI * lat2 / 180;
        var radlon1 = Math.PI * lng1 / 180;
        var radlon2 = Math.PI * lng2 / 180;
        var theta = lng1 - lng2;
        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;

        //Get in in kilometers
        dist = dist * 1.609344;

        return dist;
    }