2013-08-29 12 views
5

Mam ten skrypt, który pokaże niestandardowe znaczniki na mapie google, ale chciałbym dołączyć pole tekstowe i móc wprowadzić miasto/stan i kod pocztowy i sprawdź, czy istnieją jakieś markery w ciągu powiedzmy 400 mil od tego miasta/stanu lub kodu pocztowego. Chciałbym, żeby mapa była dynamiczna, tak jak wpisujesz miasto/stan lub kod pocztowy, pokaże wyniki na mapie, pozbywając się wszystkich pozostałych znaczników i pozostawiając tylko ten, który znajduje się w tym promieniu, jeśli jest to zbyt trudne, to wystarczy też zwykłe pole wyboru, które jest najbliższe jednostce :) Poszukałem i stwierdziłem, że muszę załadować bibliotekę geometrii i użyć computeDistanceBetween(), aby znaleźć odległość każdego znacznika od punktu środkowego, ale Nie mam pojęcia, jak wykonać część zip-code lub jak połączyć wszystkie te elementy w jedną całość.Google Maps - Znajdowanie wszystkich znaczników wewnątrz danego promienia JavaScript/Php

Oto mój kod:

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8"/> 
<title></title> 
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
<script type="text/javascript" src="http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclustererplus/src/markerclusterer.js"></script> 

<script type="text/javascript"> 
    var image = new google.maps.MarkerImage("marker-images/image.png",new google.maps.Size(40,35),new google.maps.Point(0,0),new google.maps.Point(20,35)); 

    var shadow = new google.maps.MarkerImage(
          'marker-images/shadow.png', 
          new google.maps.Size(62,35), 
          new google.maps.Point(0,0), 
          new google.maps.Point(20,35) 
         ); 

    var shape = { 
       coord: [27,0,30,1,32,2,34,3,35,4,36,5,38,6,39,7,39,8,39,9,39,10,38,11,37,12,33,13,34,14,34,15,33,16,32,17,31,18,27,19,28,20,28,21,27,22,26,23,22,25,23,26,24,27,24,28,24,29,24,30,24,31,24,32,23,33,22,34,17,34,16,33,15,32,15,31,14,30,14,29,15,28,15,27,16,26,17,25,13,23,12,22,11,21,11,20,12,19,8,18,7,17,6,16,5,15,5,14,6,13,2,12,1,11,0,10,0,9,0,8,0,7,1,6,3,5,4,4,5,3,7,2,9,1,12,0,27,0], 
       type: 'poly' 
      }; 

    // this variable will collect the html which will eventually be placed in the side_bar 
    var side_bar_html = ""; 

    // 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; 

    //marker clusterer 
    var mc; 
    var mcOptions = {gridSize: 10, maxZoom: 8}; 

    //global infowindow 
    var infowindow = new google.maps.InfoWindow(); 

    //geocoder 
    var geocoder = new google.maps.Geocoder(); 
    var address = new Array("41.8119,-87.6873", 
         "40.7888,-74.056", 
         "41.8119,-87.6873", 
         "48.6681,-97.3627", 
         "44.9793,-93.273", 
         "39.4857,-75.6775", 
         "41.8119,-87.6873", 
         "42.0203,-87.9059", 
         "32.7812,-96.7903", 
         "27.5159,-99.4941", 
         "32.7812,-96.7903", 
         "37.5608,-95.6684", 
         "41.8119,-87.6873", 
         "38.3763,-97.6702", 
         "42.2458,-83.2491", 
         "41.8122,-91.9139", 
         "41.8397,-88.0887", 
         "41.8397,-88.0887", 
         "38.5128,-122.787", 
         "41.8397,-88.0887", 
         "42.8863,-87.892", 
         "42.8863,-87.892", 
         "30.7539,-83.3321", 
         "39.889,-84.2422", 
         "34.106,-83.589"); 
    var content = new Array("Unit No# 0206", 
         "Unit No# #2003", 
         "Unit No# 0176", 
         "Unit No# #2001", 
         "Unit No# 0124", 
         "Unit No# 0157", 
         "Unit No# #0162", 
         "Unit No# 0104", 
         "Unit No# 0118", 
         "Unit No# #2007", 
         "Unit No# 0112", 
         "Unit No# 0139", 
         "Unit No# 0205", 
         "Unit No# 0127", 
         "Unit No# 0187", 
         "Unit No# 0105", 
         "Unit No# 0214", 
         "Unit No# 0186", 
         "Unit No# 0173", 
         "Unit No# 0134", 
         "Unit No# 0128", 
         "Unit No# 0125", 
         "Unit No# 0158", 
         "Unit No# 0193", 
         "Unit No# 0201"); 

    //min and max limits for multiplier, for random numbers 
    //keep the range pretty small, so markers are kept close by 
    var min = .999999; 
      var max = 1.000001; 

    function createMarker(latlng,text) { 
     var marker = new google.maps.Marker({ 
     draggable: false, 
     raiseOnDrag: false, 
     icon: image, 
     shadow: shadow, 
     shape: shape, 
     position: latlng, 
     map: map 
     }); 

    ///get array of markers currently in cluster 
    var allMarkers = mc.getMarkers(); 

    //check to see if any of the existing markers match the latlng of the new marker 
     if (allMarkers.length != 0) { 
     for (i=0; i < allMarkers.length; i++) { 
      var existingMarker = allMarkers[i]; 
      var pos = existingMarker.getPosition(); 

      if (latlng.equals(pos)) { 
      text = text + " & " + content[i]; 
      }     
     } 
     } 

     google.maps.event.addListener(marker, 'click', function() { 
     infowindow.close(); 
     infowindow.setContent(text); 
     infowindow.open(map,marker); 
     }); 
     mc.addMarker(marker); 
     return marker; 
    } 
    function initialize(){ 
     var options = { 
      zoom: 4, 
      center: new google.maps.LatLng(39.8282,-98.5795), 
      mapTypeId: google.maps.MapTypeId.ROADMAP 
     }; 
     map = new google.maps.Map(document.getElementById('map'), options); 

    //marker cluster 
     var gmarkers = []; 
     mc = new MarkerClusterer(map, [], mcOptions); 
     for (i=0; i<address.length; i++) { 
      var ptStr = address[i]; 
      var coords = ptStr.split(","); 
      var latlng = new google.maps.LatLng(parseFloat(coords[0]),parseFloat(coords[1])); 
      gmarkers.push(createMarker(latlng,content[i])); 
     } 
    } 

      function codeAddress() { 
      var address = document.getElementById('address').value; 
      var radius = parseInt(document.getElementById('radius').value, 10) * 1609.34; 
      geocoder.geocode({ 'address': address}, function(results, status) { 
       if (status == google.maps.GeocoderStatus.OK) { 
       map.setCenter(results[0].geometry.location); 
       var marker = new google.maps.Marker({ 
      //  map: map, <-- uncomment to show red marker 
        position: results[0].geometry.location 
       }); 
       if (circle) circle.setMap(null); 
       circle = new google.maps.Circle({center:marker.getPosition(), 
               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(),marker.getPosition()) < radius) { 
        bounds.extend(gmarkers[i].getPosition()) 
        gmarkers[i].setMap(map); 
      foundMarkers++; 
        } else { 
        gmarkers[i].setMap(null); 
        } 
       } 
       if (foundMarkers > 0) { 
        map.fitBounds(bounds); 
      } else { 
        map.fitBounds(circle.getBounds()); 
       } 
       } else { 
       alert(status); 
       } 
      }); 
      } 

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


    function handleKeyPress(e){ 
    var key=e.keyCode || e.which; 
     if (key==13){ 
     codeAddress(); 
     } 
    } 

    function handleResetKeyPress(e){ 
     if (map.getZoom() != 4) map.setZoom(4); 
      map.setCenter(new google.maps.LatLng(39.8282, -98.5795)); 
     document.getElementById("address").value = 'Enter City,State or Zipcode'; 
     document.getElementById("radius").value = '200'; 
    } 
    </script> 

    <style> 
    html, body, #map { 
    height: 100%; 
    width: 100%; 
    margin: 0; 
    padding: 0; 
    } 
    .auto-style1 { 
     text-align: center; 
    } 
     #footer { 
     position : absolute; 
     bottom : 0; 
     height : 40px; 
     margin-top : 40px; 
    /* border: 1px solid blue; */ 
     } 
    </style> 
    </head> 
    <body onload='initialize()'> 
    <div id="map"></div> 
    <div id="footer" class="auto-style1" style="left: 0px; bottom: 0; width: 100%"> 
      <input type="text" id="address" value="Enter City,State or Zipcode" onclick="if(this.value=='Enter City,State or Zipcode'){this.value=''}" onblur="if(this.value==''){this.value='Enter City,State or Zipcode'}" onkeypress="handleKeyPress(event);" style="width: 183px"> 
      <input type="button" value="Search" onclick="codeAddress();"> 
      <input type="button" value="Reset" onclick="handleResetKeyPress();"> 
      <input type="text" id="radius" value="200" style="width: 42px" onclick="if(this.value=='200'){this.value=''}" onblur="if(this.value==''){this.value='200'}" onkeypress="handleKeyPress(event);"> miles 
    </div> 
    </body> 
</html> 
+0

[przykład promień wyszukiwania] (http://www.geocodezip.com/v3_MW_example_map3_radiusSearch.html) – geocodezip

+1

robię dokładnie tak samo jak ty na jednym z moich mapach nie mógł pracować na zewnątrz rozsądny sposób na zrobienie tego dokładnie i zwrócenie listy tekstowej (chociaż muszę w pewnym momencie powrócić do niej w przyszłości) na razie robię to jako @geocodezip w jego przykładzie i po prostu zrzucam okrągłą nakładkę z promieniem X na górze mapy i pozwala użytkownikowi klikać na rynkach, aby opracować rzeczywiste elementy w samym regionie. – Dave

+0

@geocodezip Dzięki za ten link działa dla mnie świetnie, bardzo bym chciał, gdybym miał listę tekstów, jak powiedział Dave, ale myślę, że będę musiał z tym żyć. Czy możesz po prostu powiedzieć mi, czy mam zamiar przeliczyć z km na mile? Wiem, że ma to do czynienia z var radius = parseInt (document.getElementById ('radius'). Value); ale z jaką wartością ja to robię? – compcobalt

Odpowiedz

4

Oto przykład, jak można rozwiązać ten problem za pomocą interfejsu API geokodowania i prostych geometrii.

(zauważ, że mam ustalony adres i promień dla zwięzłości.)

// we assume that you have an array of markers 
var markers = []; 

//In order to lookup the the position of a zip-code you can use the geocoding API: 
// https://developers.google.com/maps/documentation/geocoding/ 
var geocode_api_base_url = "http://maps.googleapis.com/maps/api/geocode/json?"; 
var params = { 
    adress : 05673, 
    components : "country:us", 
    sensor : false 
} 
// This is the result set of markers in area 
var in_area = []; 

// http://maps.googleapis.com/maps/api/geocode/json?address=05673&components=country:US&sensor=false 
$.getJSON(geocode_api_base_url + $.param(params), function(data) { 

    var location, search_area, in_area = []; 

    location = data['results'][0]['address_components']['geometry']['location']; 

    // We create a circle to look within: 
    search_area = { 
     strokeColor: '#FF0000', 
     strokeOpacity: 0.8, 
     strokeWeight: 2, 
     center : new google.maps.LatLng(location.lat, location.lon), 
     radius : 500 
    } 

    search_area = new google.maps.Circle(search_area); 

    $.each(markers, function(i,marker) { 
     if (google.maps.geometry.poly.containsLocation(marker.getPosition(), search_area)) { 
     in_area.push(marker); 
     } 
    }); 

    console.info(in_area); 

}); 
8

Oto przykład roboczych.

W przykładzie użyto all_locations - tablica przykładowych lokalizacji.

Można to zastąpić lokalizacjami (np. Lokalizacjami pobranymi z bazy danych). Możesz wstawić dowolny adres do paska wprowadzania, np. "123 New Street, New York, 56789, NY" i przy użyciu kodu google.maps.Geocoder geokoduje tę mapę w lokalizacji LatLng, wokół której narysuje promień. Tylko lokalizacje znajdujące się w promieniu wokół adresu będą wyświetlane na mapie. Aby zobaczyć przykładowe lokalizacje, wpisz "Second Steet, New York" jako adres.

var map = null; 
 
    var radius_circle; 
 
    var markers_on_map = []; 
 
    var geocoder; 
 
    var infowindow; 
 
    
 
    //all_locations is just a sample, you will probably load those from database 
 
    var all_locations = [ 
 
\t {type: "Restaurant", name: "Restaurant 1", lat: 40.723080, lng: -73.984340}, 
 
\t {type: "School", name: "School 1", lat: 40.724705, lng: -73.986611}, 
 
\t {type: "School", name: "School 2", lat: 40.724165, lng: -73.983883}, 
 
\t {type: "Restaurant", name: "Restaurant 2", lat: 40.721819, lng: -73.991358}, 
 
\t {type: "School", name: "School 3", lat: 40.732056, lng: -73.998683} 
 
    ]; 
 

 
    //initialize map on document ready 
 
    $(document).ready(function(){ 
 
     var latlng = new google.maps.LatLng(40.723080, -73.984340); //you can use any location as center on map startup 
 
     var myOptions = { 
 
     zoom: 1, 
 
     center: latlng, 
 
     mapTypeControl: true, 
 
     mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU}, 
 
     navigationControl: true, 
 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
 
     }; 
 
     map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
 
\t geocoder = new google.maps.Geocoder(); 
 
     google.maps.event.addListener(map, 'click', function(){ 
 
      if(infowindow){ 
 
      infowindow.setMap(null); 
 
      infowindow = null; 
 
      } 
 
     }); 
 
    }); 
 
    
 
    function showCloseLocations() { 
 
    \t var i; 
 
    \t var radius_km = $('#radius_km').val(); 
 
    \t var address = $('#address').val(); 
 

 
    \t //remove all radii and markers from map before displaying new ones 
 
    \t if (radius_circle) { 
 
    \t \t radius_circle.setMap(null); 
 
    \t \t radius_circle = null; 
 
    \t } 
 
    \t for (i = 0; i < markers_on_map.length; i++) { 
 
    \t \t if (markers_on_map[i]) { 
 
    \t \t \t markers_on_map[i].setMap(null); 
 
    \t \t \t markers_on_map[i] = null; 
 
    \t \t } 
 
    \t } 
 

 
    \t if (geocoder) { 
 
    \t \t geocoder.geocode({'address': address}, function (results, status) { 
 
    \t \t \t if (status == google.maps.GeocoderStatus.OK) { 
 
    \t \t \t \t if (status != google.maps.GeocoderStatus.ZERO_RESULTS) { 
 
    \t \t \t \t \t var address_lat_lng = results[0].geometry.location; 
 
    \t \t \t \t \t radius_circle = new google.maps.Circle({ 
 
    \t \t \t \t \t \t center: address_lat_lng, 
 
    \t \t \t \t \t \t radius: radius_km * 1000, 
 
    \t \t \t \t \t \t clickable: false, 
 
\t \t \t \t \t \t map: map 
 
    \t \t \t \t \t }); 
 
        if (radius_circle) map.fitBounds(radius_circle.getBounds()); 
 
    \t \t \t \t \t for (var j = 0; j < all_locations.length; j++) { 
 
    \t \t \t \t \t \t (function (location) { 
 
    \t \t \t \t \t \t \t var marker_lat_lng = new google.maps.LatLng(location.lat, location.lng); 
 
    \t \t \t \t \t \t \t var distance_from_location = google.maps.geometry.spherical.computeDistanceBetween(address_lat_lng, marker_lat_lng); //distance in meters between your location and the marker 
 
    \t \t \t \t \t \t \t if (distance_from_location <= radius_km * 1000) { 
 
    \t \t \t \t \t \t \t \t var new_marker = new google.maps.Marker({ 
 
    \t \t \t \t \t \t \t \t \t position: marker_lat_lng, 
 
    \t \t \t \t \t \t \t \t \t map: map, 
 
    \t \t \t \t \t \t \t \t \t title: location.name 
 
    \t \t \t \t \t \t \t \t });  \t \t \t \t \t \t \t \t google.maps.event.addListener(new_marker, 'click', function() { 
 
            if(infowindow){ 
 
      infowindow.setMap(null); 
 
      infowindow = null; 
 
      } 
 
    \t \t \t \t \t \t \t \t \t infowindow = new google.maps.InfoWindow(
 
      { content: '<div style="color:red">'+location.name +'</div>' + " is " + distance_from_location + " meters from my location", 
 
       size: new google.maps.Size(150,50), 
 
       pixelOffset: new google.maps.Size(0, -30) 
 
      , position: marker_lat_lng, map: map}); 
 
    \t \t \t \t \t \t \t \t }); 
 
    \t \t \t \t \t \t \t \t markers_on_map.push(new_marker); 
 
    \t \t \t \t \t \t \t } 
 
    \t \t \t \t \t \t })(all_locations[j]); 
 
    \t \t \t \t \t } 
 
    \t \t \t \t } else { 
 
    \t \t \t \t \t alert("No results found while geocoding!"); 
 
    \t \t \t \t } 
 
    \t \t \t } else { 
 
    \t \t \t \t alert("Geocode was not successful: " + status); 
 
    \t \t \t } 
 
    \t \t }); 
 
    \t } 
 
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<script type="text/javascript" src="https://www.google.com/jsapi"></script> 
 
<script type="text/javascript"> 
 
     google.load("maps", "3",{other_params:"sensor=false&libraries=geometry"}); 
 
     </script> 
 

 
<body style="margin:0px; padding:0px;" > 
 
<input id="address" value="Second Steet, New York" placeholder="Input Address"/> 
 
<select id="radius_km"> 
 
\t <option value=1>1km</option> 
 
\t <option value=2>2km</option> 
 
\t <option value=5>5km</option> 
 
\t <option value=30>30km</option> 
 
</select> 
 
<button onClick="showCloseLocations()">Show Locations In Radius</button> 
 
<div id="map_canvas" style="width:500px; height:300px;"> 
 
</body> 
 
</html>

+0

Dzięki, odpowiedź jest przydatna dla mnie.Zdobywam Up.Code napisany przez ciebie jest do moich wymagań. Chcę sugestię, jak zmienić kolor, szerokość i kolor przezroczystości okręgu w okrągłym obszarze. –

+0

Opcja 'obiekt google.maps.Circle' ma właściwości takie jak' strokeWeight, fillColor, fillOpacity' ... Można ustawić je podczas tworzenia kręgu, np .: 'radius_circle = new google.maps.Circle ({ \t \t \t \t \t \t centrum: address_lat_lng, \t \t \t \t \t \t promień: radius_km * 1000, \t \t \t \t \t \t klikalny: false, \t \t \t\t \t: map, fillOpacity: 0,5, fillColor: 'FFFFFF' \t \t \t \t \t}); 'Więcej w Dokumentach https://developers.google.com/maps/documentation/javascript/3 .exp/reference (wyszukaj "google.maps.Circle class") –

Powiązane problemy