Как использовать geocoder.getLatLng() Google Maps и сохранить результат в базе данных?

Всем привет! Я пытаюсь использовать getLatLng() для геокодирования списка почтовых/почтовых индексов и сохранения сгенерированной точки в базе данных для последующего размещения на карте. Это то, что у меня есть до сих пор:

 $(".geocodethis").click(function () {
    var geocoder = new GClientGeocoder();
    var postalCode = $(this).siblings(".postal").val();
    var id = $(this).siblings(".id").val();

    geocoder.getLatLng(postalCode, function (point) {
        if (!point) {
            alert(postalCode + " not found");
        } else {
            alert(point);
            var serializedPoint = $.param(point);                
            //Geocode(id, point);
        }
    });

});

function Geocode(id, point) {
    alert(point);
    $.post("/Demographic/Geocode/" + id, point, function () {
        alert("success?");
    });
}

но я получаю this.lat is not a function в своей консоли ошибок, когда пытаюсь сериализовать точечный объект или использовать его в $.post()

Из моих исследований я понимаю, что geocoder.getLatLng() асинхронный, как это повлияет на то, что я пытаюсь сделать? Я не запускаю этот код в цикле и пытаюсь опубликовать точку, используя функцию анонимного обратного вызова.

Как я могу сохранить информацию из point, чтобы использовать ее позже?

Обновить

Создание маркера и попытка опубликовать его по-прежнему приводят к this.lat is not a function в консоли ошибок.

$(".geocodethis").click(function () {
        var geocoder = new GClientGeocoder();
        var postalCode = $(this).siblings(".postal").val();
        var id = $(this).siblings(".id").val();

        geocoder.getLatLng(postalCode, function (point) {
            if (!point) {
                alert(postalCode + " not found");
            } else {
                alert(point);
                var marker = new GMarker(point);

                $.post("/Demographic/Geocode/" + id, marker, function () {
                    alert("success?");
                });
            }
        });

    });

** Еще одно обновление **

Мне действительно нужно сохранить геокодированный адрес на потом, даже если я сохраню значения широты/долготы в своей базе данных и переделаю маркер, когда буду готов нанести его на карту. Опять же, сериализация или публикация - по-видимому, использование точки любым способом, кроме функций Google Maps, дает исключение this.lat is not a function в моем журнале ошибок.

Я использую asp.net mvc - есть ли какие-нибудь фреймворки, которые упростили бы это? Мне действительно нужна помощь с этим. Спасибо.


person Grahame A    schedule 25.04.2011    source источник


Ответы (4)


Если вы застряли на 2 дня, возможно, было бы неплохо начать новую версию v3, этот фрагмент делает аналогичную работу для меня ...

          function GetLocation(address) {
          var geocoder = new google.maps.Geocoder();
          geocoder.geocode({ 'address': address }, function (results, status) {
              if (status == google.maps.GeocoderStatus.OK) {
                  ParseLocation(results[0].geometry.location);

              }
              else
                alert('error: ' + status);

          });
      }

  }

  function ParseLocation(location) {

      var lat = location.lat().toString().substr(0, 12);
      var lng = location.lng().toString().substr(0, 12);

      //use $.get to save the lat lng in the database
      $.get('MatchLatLang.ashx?action=setlatlong&lat=' + lat + '&lng=' + lng,
            function (data) {
                // fill textboss (feedback purposes only) 
                //with the found and saved lat lng values
                $('#tbxlat').val(lat);
                $('#tbxlng').val(lng);
                $('#spnstatus').text(data);


            });
    }
person Arnoldiusss    schedule 28.04.2011
comment
любая причина, по которой вы используете $.get() вместо $.post() - person Grahame A; 29.04.2011
comment
Я связываю карты Google v3, используя <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>, это правильно? Я все еще получаю, что this.lat() не является функцией. - person Grahame A; 29.04.2011
comment
любая причина, по которой вы используете $.get() вместо $.post() Не совсем, просто потому, что это лишь небольшой объем данных... - person Arnoldiusss; 29.04.2011

Вы пробовали это?

$(".geocodethis").click(function () {
    var geocoder = new GClientGeocoder();
    var postalCode = $(this).siblings(".postal").val();
    var id = $(this).siblings(".id").val();

    geocoder.getLatLng(postalCode, function (point) {
        if (!point) {
            alert(postalCode + " not found");
        } else {
            alert(point);
            var marker = new GMarker(point);
            map.addOverlay(marker);
            obj = {lat: marker.position.lat(),
                   lng: marker.position.lng()};
            $.post("/Demographic/Geocode/" + id, obj, function () {
                alert("success?");
            });
        }
    });

});

Я не использовал V2 в течение длительного времени, поэтому я не уверен в точном синтаксисе, но суть в том, чтобы создать объект из нужной вам информации (широта/долгота) и сериализовать это .

Кроме того, рекомендуется обновление до версии V3, если это возможно.

person Herman Schaaf    schedule 28.04.2011

Вам нужно установить маркер на карте, который занимает широту / долготу. Вы можете сохранить эту информацию, как хотите, или отобразить сразу. (Код урезан для демонстрационных целей)

map = new google.maps.Map(document.getElementById("Map"), myOptions);
geocoder.geocode({ 'address': address }, function (results, status) {
    if (status == google.maps.GeocoderStatus.OK) {      
        var marker = new google.maps.Marker({
            position: results[0].geometry.location
        });
        marker.setMap(map);
    }
}

ОБНОВЛЕНИЕ (ДЛЯ v2)

$(".geocodethis").click(function () {
    var geocoder = new GClientGeocoder();
    var postalCode = $(this).siblings(".postal").val();
    var id = $(this).siblings(".id").val();

    geocoder.getLatLng(postalCode, function (point) {
        if (!point) {
            alert(postalCode + " not found");
        } else {
            map.setCenter(point, 13);
            var marker = new GMarker(point);
            map.addOverlay(marker);
        }
    });

});
person Dustin Laine    schedule 25.04.2011
comment
я думаю, что он использует API Google Map v2 на основе GClientGeocoder - person KJYe.Name 葉家仁; 26.04.2011
comment
Итак, результаты будут для меня точкой, а это массив? Таким образом, результаты [0] будут Y, а результаты [1] будут X? Потому что это не позволяет мне сохранять результаты. Или сохранить маркер? - person Grahame A; 26.04.2011
comment
Извините, спасибо @kjy112, который заметил, что вы используете v2. Однако для версии 3 results[0] — это просто лучший результат поиска, а results[0].geometry.location — полная широта/долгота лучшего результата. - person Dustin Laine; 26.04.2011
comment
ах, хорошо - так... что мне делать для v2? - person Grahame A; 26.04.2011
comment
:( Я все еще получаю this.lat is not a function - person Grahame A; 26.04.2011
comment
Нигде в вашем или моем коде нет this.lat. Вы уверены, что проблема не в другом месте? Вы отладчик JS, чтобы найти оскорбительную строку. - person Dustin Laine; 26.04.2011
comment
это происходит из строки 278 в http://maps.gstatic.com/intl/en_ALL/mapfiles/310c/maps2.api/main.js - person Grahame A; 26.04.2011
comment
Разве я не должен просто обновиться до V3? Это решит все это? - person Grahame A; 26.04.2011
comment
:( Обновление до более нового кода вызывает ту же ошибку. Error: this.lat is not a function Source File: http://maps.gstatic.com/intl/en_us/mapfiles/api-3/4/9/main.js Line: 11 - person Grahame A; 26.04.2011
comment
Тогда у вас что-то еще идет не так. Я опубликовал свой первоначальный фрагмент рабочего кода. - person Dustin Laine; 26.04.2011
comment
Но мне нужно как-то его сохранить, и именно здесь выбрасывается исключение, на почту. Вы показали мне, как поставить точку на карте. У меня нет здесь карты. - person Grahame A; 26.04.2011
comment
Чтобы сохранить его, вам нужно поместить его в какое-то хранилище данных, БД, файл cookie и т. д. - person Dustin Laine; 26.04.2011
comment
Спасибо, приятель, я так и понял :D. Но мне нужно опубликовать его на моем сервере, чтобы сохранить его в моей БД, и он выдает исключение this.lat, когда я пытаюсь сериализовать или опубликовать результат. - person Grahame A; 26.04.2011
comment
Это совсем другая проблема, и вы должны опубликовать соответствующий код для сериализации и публикации. - person Dustin Laine; 26.04.2011
comment
Я сделал, в моем первоначальном вопросе. $.param(point) сериализует объект, а моя функция публикации закомментирована. Оба выдают ошибку. - person Grahame A; 26.04.2011

В V3 координаты должны быть сначала сериализованы в виде строки, как показано Арнольдиусом, перед отправкой в ​​виде данных json post.

var lat = latlong.lat().toString().substr(0, 12); var lng = latlong.lng().toString().substr(0, 12);

person peterincumbria    schedule 10.10.2011