Google Maps API, получить пользовательский город / ближайший город / общую область - PullRequest
0 голосов
/ 29 апреля 2018

Я пытался закодировать функцию, которая возвращает наиболее разумный город среднего размера, в котором находится человек.

Приложения, такие как yik yak, использовали подобный алгоритм для группировки людей. Есть ли какие-либо алгоритмы для этого? На данный момент я использую это:

 geocoder.geocode({'latLng': latlng}, function (results, status) {

        var city = 'Unknown';
        if (status == google.maps.GeocoderStatus.OK) {

            var details = results[0].address_components;

            for (var i = details.length-1; i >= 0; i--) {
                for (var j=0; j<details[i].types.length;j++) {

                    if (details[i].types[j] == 'locality') {
                        city = details[i].long_name;
                    } else if (details[i].types[j] == 'sublocality') {
                        city = details[i].long_name;
                    } else if (details[i].types[j] == 'neighborhood') {
                        city = details[i].long_name;
                    }
                }
            }

Что не самый лучший. Я только что попытался ввести эти координаты: {широта: 53.4808, долгота: -2.7426}

И стал неизвестным. Просматривая результаты, полученные геокодером, я вижу, что Сент-Хеленс была бы наиболее разумной группой, в которую можно было бы поместить этого пользователя. Если бы этого не было, я вижу, что также возвращается Мерсисид, что будет следующим лучшим решением.

1 Ответ

0 голосов
/ 29 апреля 2018

Мне кажется, что и Сент-Хеленс, и Мерсисайд являются результатом обратного геокодера.

результат обратного геокодирования:

[
  {"long_name":"Unnamed Road","short_name":"Unnamed Road","types":["route"]},
  {"long_name":"Saint Helens","short_name":"Saint Helens","types":["postal_town"]},
  {"long_name":"Merseyside","short_name":"Merseyside","types":["administrative_area_level_2","political"]},
  {"long_name":"England","short_name":"England","types":["administrative_area_level_1","political"]},
  {"long_name":"United Kingdom","short_name":"GB","types":["country","political"]},
  {"long_name":"WA11","short_name":"WA11","types":["postal_code","postal_code_prefix"]}
]

Если вы добавите эти типы в оператор if, он появится в результате:

  for (var i = details.length-1; i >= 0; i--) {
    for (var j=0; j<details[i].types.length;j++) {
      if (details[i].types[j] == 'locality') {
        city = details[i].long_name;
      } else if (details[i].types[j] == 'sublocality') {
        city = details[i].long_name;
      } else if (details[i].types[j] == 'neighborhood') {
        city = details[i].long_name;
      } else if (details[i].types[j] == 'postal_town') {
        city = details[i].long_name;
      } else if (details[i].types[j] == 'administrative_area_level_2') {
        city = details[i].long_name;
      }
    }
  }
  console.log("city="+city);
}

подтверждение концепции скрипки

фрагмент кода:

var geocoder;
var map;

function initialize() {
  var map = new google.maps.Map(
    document.getElementById("map_canvas"), {
      center: new google.maps.LatLng(53.4808, -2.7426),
      zoom: 12,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });
  var marker = new google.maps.Marker({
    map: map,
    position: map.getCenter(),
  });
  geocoder = new google.maps.Geocoder();
  geocoder.geocode({
    'latLng': new google.maps.LatLng(53.4808, -2.7426)
  }, function(results, status) {

    var city = 'Unknown';
    if (status == google.maps.GeocoderStatus.OK) {

      var details = results[0].address_components;
      console.log(JSON.stringify(details));
      for (var i = details.length - 1; i >= 0; i--) {
        for (var j = 0; j < details[i].types.length; j++) {
          if (details[i].types[j] == 'locality') {
            city = details[i].long_name;
          } else if (details[i].types[j] == 'sublocality') {
            city = details[i].long_name;
          } else if (details[i].types[j] == 'neighborhood') {
            city = details[i].long_name;
          } else if (details[i].types[j] == 'postal_town') {
            city = details[i].long_name;
            console.log("postal_town=" + city);
          } else if (details[i].types[j] == 'administrative_area_level_2') {
            city = details[i].long_name;
            console.log("admin_area_2=" + city);
          }
        }
      }
      console.log("city=" + city);
      document.getElementById('city').innerHTML = "city=" + city;
    }
  })
}
google.maps.event.addDomListener(window, "load", initialize);
html,
body,
#map_canvas {
  height: 100%;
  width: 100%;
  margin: 0px;
  padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js"></script>
<div id="city"></div>
<div id="map_canvas"></div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...