如何实时拖动标记反向地理编码和重新填充菜单

How to reverse geocoding and repopulate menu in real time dragging marker

我有以下 javascript 代码:

function getLatLng() {
    var geocoder = new google.maps.Geocoder();
    var address = document.getElementById('address2').value;

     var input = document.getElementById('address2');
    var options = {
    types: [],
    };

var autocomplete = new google.maps.places.Autocomplete(input, options);

    geocoder.geocode({
        'address': address
    }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var latLng = results[0].geometry.location;
            $('#lat').val(results[0].geometry.location.lat());
            $('#lng').val(results[0].geometry.location.lng());
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}
function getLatLng2() {
    var geocoder = new google.maps.Geocoder();
    var e = document.getElementById('city');
var address = e.options[e.selectedIndex].text;

    geocoder.geocode({
        'address': address
    }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var latLng = results[0].geometry.location;
            $('#lat').val(results[0].geometry.location.lat());
            $('#lng').val(results[0].geometry.location.lng());
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}
function getLatLng3() {
    var geocoder = new google.maps.Geocoder();
    var e = document.getElementById('region');
var address = e.options[e.selectedIndex].text;

    geocoder.geocode({
        'address': address
    }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var latLng = results[0].geometry.location;
            $('#lat').val(results[0].geometry.location.lat());
            $('#lng').val(results[0].geometry.location.lng());
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}
function getLatLng4() {
    var geocoder = new google.maps.Geocoder();
    var e = document.getElementById('province');
var address = e.options[e.selectedIndex].text;

    geocoder.geocode({
        'address': address
    }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var latLng = results[0].geometry.location;
            $('#lat').val(results[0].geometry.location.lat());
            $('#lng').val(results[0].geometry.location.lng());
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}
function getLatLng5() {
    var geocoder = new google.maps.Geocoder();
    var e = document.getElementById('country');
var address = e.options[e.selectedIndex].text;

    geocoder.geocode({
        'address': address
    }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var latLng = results[0].geometry.location;
            $('#lat').val(results[0].geometry.location.lat());
            $('#lng').val(results[0].geometry.location.lng());
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}
function getLatLng6() {
    var geocoder = new google.maps.Geocoder();
    var e = document.getElementById('continent');
var address = e.options[e.selectedIndex].text;

    geocoder.geocode({
        'address': address
    }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var latLng = results[0].geometry.location;
            $('#lat').val(results[0].geometry.location.lat());
            $('#lng').val(results[0].geometry.location.lng());
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}
//

var whos = null;
var placedata = [];
var geocoder = new google.maps.Geocoder();
var map;
function getplaces(gid, src) {
    if ( !! placedata[gid]) {
        map.setCenter({
            lat: parseFloat(placedata[gid].lat),
            lng: parseFloat(placedata[gid].lng)
        });
        switch (src) {
            case "continent":
                map.setZoom(3);
                break;
            case "country":
                map.setZoom(5);
                break;
            case "province":
                map.setZoom(6);
                break;
            case "region":
                map.setZoom(7);
                break;
            case "city":
                map.setZoom(8);
                break;
        }
        codeAddress(placedata[gid].name);
    }

    whos = src;


    //  var  request = "http://ws.geonames.org/childrenJSON?geonameId="+gid+"&callback=getLocation&style=long";
    var request = "http://www.geonames.org/childrenJSON?geonameId=" + gid + "&callback=listPlaces&style=long";
    aObj = new JSONscriptRequest(request);
    aObj.buildScriptTag();
    aObj.addScriptTag();
}

function listPlaces(jData) {
    counts = jData.geonames.length < jData.totalResultsCount ? jData.geonames.length : jData.totalResultsCount;
    who = document.getElementById(whos);
    who.options.length = 0;

    if (counts) who.options[who.options.length] = new Option('Select', '');
    else who.options[who.options.length] = new Option('No Data Available', 'NULL');

    for (var i = 0; i < counts; i++) {
        who.options[who.options.length] = new Option(jData.geonames[i].name, jData.geonames[i].geonameId);
        placedata[jData.geonames[i].geonameId] = jData.geonames[i];
    }

    delete jData;
    jData = null;
}
function zoomto(gid) {
   if ( !! placedata[gid]) {
        map.setCenter({
            lat: parseFloat(placedata[gid].lat),
            lng: parseFloat(placedata[gid].lng)
        });
       map.setZoom(14);
   }
}

function codeAddress(address) {   
    geocoder.geocode({
        'address': address
    }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            if (!!results && !!results[0] && !!results[0].geometry && !!results[0].geometry.viewport) {
                map.fitBounds(results[0].geometry.viewport);
            } else if (!!results && !!results[0] && !!results[0].geometry && !!results.geometry.bounds) {
                map.fitBounds(results[0].geometry.bounds);
            } else {
                map.setCenter(results[0].geometry.location);
            }
 var marker = new google.maps.Marker({
          map: map,
          position: results[0].geometry.location
      });          

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

function codeAddress2() {
  var address = document.getElementById('address2').value;
  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,
          position: results[0].geometry.location
      });
    } else {
      alert('Geocode was not successful for the following reason: ' + status);
    }
  });
}


window.onload = function () {
    getplaces(6295630, 'continent');
    map = new google.maps.Map(document.getElementById('map_canvas'), {
        zoom: 3,
        center: {
            lat: 0,
            lng: 0
        }
    });
};

完整的演示是 here (fiddle) 选择大陆、州、地区等我得到纬度和经度

如果我插入一个可拖动的标记:

var marker = new google.maps.Marker({
          map: map,
          position: results[0].geometry.location,
          draggable:true,
          title: 'Drag Me!'

      });

移动地图中的标记我想在菜单中实时更改大陆、州、城市等。可能吗?怎么样?

您可以在下拉列表 "options" 中搜索地理编码器返回的结果。由于数据来自不同的来源,它可能找不到正确的结果,但这对我有用(至少对于堪萨斯州的威奇托),尽管它需要为每个地址组件拖动。此时,要更改它,您需要重构代码。

function setDropdown(menuId, string) {
  var menu = document.getElementById(menuId);
  var selectedIndex = menu.selectedIndex;
  for (var option = 0; option < menu.options.length; option++) {
    if (nodeValue(menu.options[option]).indexOf(string) != -1) {
      if (selectedIndex != option) {
        menu.options[option].setAttribute("selected", "selected");
        menu.onchange();
      }
      break;
    }
  }
}

function displayAddress(address) {
  for (var p = address.length - 1; p >= 0; p--) {
    for (var t = 0; t < address[p].types.length; t++) {
      if (address[p].types[t] == "country") {
        setDropdown('country', address[p].long_name);
      }
      if (address[p].types[t] == "administrative_area_level_1") {
        console.log("admin_area_level_1=" + address[p].long_name);
        setDropdown('province', address[p].long_name)
      }
      if (address[p].types[t] == "administrative_area_level_2") {
        console.log("admin_area_level_2=" + address[p].long_name);
        setDropdown('region', address[p].long_name)
      }
      if (address[p].types[t] == "locality") {
        console.log("locality=" + address[p].long_name);
        setDropdown('city', address[p].long_name);
      }
    }
  }
}

proof of concept fiddle