بحاجة إلى مساعدة عكس الترميز الجغرافي إلى إلحاق رسالة إلى GLatLng تنسيق

StackOverflow https://stackoverflow.com/questions/816479

  •  03-07-2019
  •  | 
  •  

سؤال

قانون بلدي: http://jsbin.com/epuxu

مع مساعدة من ذلك ، تمكنت من الحصول على عناوين geocoded و حسب دبابيس وضعت على الخريطة. المشكلة لا أستطيع تحديد الإحداثيات من أجل إلحاق رسالة #div الخريطة لأن ليس لدي إحداثيات بعد الآن.

وأظن أنا أفعل شيء خاطئ في هذا القسم:

/* Message
--------------------*/
$("#message").appendTo(map.getPane(G_MAP_FLOAT_SHADOW_PANE));

    function displayPoint(marker, index){
        $("#message").hide();

        var moveEnd = GEvent.addListener(map, "moveend", function(){
            var markerOffset = map.fromLatLngToDivPixel(marker.getLatLng());
            $("#message")
                .fadeIn()
                .css({ top:markerOffset.y, left:markerOffset.x });

            GEvent.removeListener(moveEnd);
        });
        map.panTo(marker.getLatLng());
    }

وهي تعمل عند استخدام الأصلي تنسيق رمز (هذا هو علق على jsbin):

var markers = [
    [39.729308,-121.854087],
    [39.0,-121.0]
    ];

    for (var i = 0; i < markers.length; i++) {
        var point = new GLatLng(markers[i][0], markers[i][1]);
        marker = new GMarker(point);
        map.addOverlay(marker);
        markers[i] = marker;
    }

ولكن أنا بحاجة إلى مساعدة الحصول على العمل بهذا القانون الحالي:

function showAddress(markers) {
    if (geocoder) {
        geocoder.getLatLng(markers,
            function(point) {
                if (!point) {
                    alert(markers + " not found");
                } else {
                    marker = new GMarker(point);
                    map.addOverlay(marker);
                    markers[i] = marker;
                }
            }
        );
    }
}

for (var i = 0; i < markers.length; i++) {
    showAddress(markers[i]);
}

أنا نوعا ما جديدة على استخدام خرائط جوجل api, لذلك أي فكرة عن ما أفعله خطأ من شأنه أن يكون مفيدا جدا.شكرا =]

هل كانت مفيدة؟

المحلول

أخشى أن هناك عدد قليل من الأشياء الخطأ في الكود الخاص بك :P

كان لي أن تفعل شيئا من الجراحة التجميلية ولكن ها هي النتيجة: http://jsbin.com/atofe

وفيما يلي وصف التغييرات التي قمت بها.اسمحوا لي أن أعرف إذا كنت بحاجة إلى المساعدة في فهم أي شيء.


<script type="text/javascript">
  document.write(marker);
</script>

كان التعليق هذا منذ كان مما تسبب في الخطأ.أعتقد أنك تركته هناك عن طريق الخطأ.

<script type="text/javascript">
  // document.write(marker);
</script>

var markers = [
  ["624 Nord Ave #20, Chico CA"],
  ["200 Nord Ave, Chico CA"],
  ["100 Nord Ave, Chico CA"],
  ["5th and Ivy, Chico CA"]
];

منذ نحن نستخدم عناوين بدلا من إحداثيات, أنت لا تحتاج إلى (في الواقع يجب أن لا لأنه فقط في تعقيد الأمور) تغلف كل سلسلة في صفيف.أنا أيضا تسميته إلى addresses لجعل الأمر أكثر وضوحا ومنع الصراعات الفعلية علامات (أكثر على ذلك لاحقا).

var addresses = [
  "624 Nord Ave #20, Chico CA",
  "200 Nord Ave, Chico CA",
  "100 Nord Ave, Chico CA",
  "5th and Ivy, Chico CA"
];

function showAddress(markers) {
  if (geocoder) {
    geocoder.getLatLng(markers,
      function(point) {
        if (!point) {
          alert(markers + " not found");
        } else {
          marker = new GMarker(point);
          map.addOverlay(marker);
          markers[i] = marker;
        }
      }
    );
  }
}

for (var i = 0; i < markers.length; i++) {
  showAddress(markers[i]);
}


/* Add Markers to List
--------------------*/
$(markers).each(function(i,marker){
  $("<li>")
    .html(i+" - "+marker)
    .click(function(){
      displayPoint(marker, i);
    })
    .appendTo("#list");
  GEvent.addListener(marker, "click", function(){
    displayPoint(marker, i);
  });
});

هذا هو حيث كان معظم التغييرات.قمت بعمل عدة أخطاء كبيرة هنا.

أولا, يمكنك إعادة استخدام متغير markers عندما يجب أن يكون استخدام اسم جديد.في عملية كتب على مجموعة من العناوين سلاسل يساء فهمها حيث كانت الأمور المخزنة (هذا هو السبب في أنني سميت مجموعة من معالجة السلاسل addresses).

الثاني حاولت إضافة علامات إلى قائمة قبل فإن القالب عاد فعلا ردها.أعتقد أنك لم تدرك أن getLatLng هو وظيفة غير متزامن ، بحيث ينفذ وظيفة رد الاتصال فقط بعد القالب يعود ردها.بما أنك لم تنتظر ردا على ذلك ، فقد أصدرت "إضافة علامات إلى قائمة" القسم مجدية مثل علامات لم يتم استردادها حتى الآن.

لذا لإصلاح هذه القضايا انتقلت "إضافة علامات إلى قائمة" داخل القسم الجديد handleGeocoderResponse وظيفة.وهذا يضمن علامات تضاف إلى قائمة إلا بعد القالب يتم إرجاع استجابة.وأود أيضا أن استخدام مزدوجإغلاق منذ أن تستخدم حلقة جنبا إلى جنب مع وظيفة غير متزامن.

function handleGeocoderResponse(addr, j) {
  /*
    These are closures. We have to return a function
    that contains our Geocoder repsonse handling code
    in order to capture the values of "addr" and "j"
    as they were when they were passed in.  
  */
  return (function(point) {

    if (!point) {
      alert(addr + " not found");
    }
    else {
      var marker = new GMarker(point);
      map.addOverlay(marker);

      /* Add markers to list
      ------------------------*/
      $("<li>")
        .html(j + " - " + addr)
        .click(function(){
          displayPoint(marker, j);
        })
        .appendTo("#list");

      GEvent.addListener(marker, "click", function(){
        displayPoint(marker, j);
      });
    }

  });
}

for (var i = 0; i < addresses.length; i++) {
  if (geocoder) {
    var address = addresses[i];
    geocoder.getLatLng(
      address,
      handleGeocoderResponse(address, i)
    );
  }
}

نصائح أخرى

لست متأكدا بالضبط ما كنت أبحث عنه.من قبل "#message div"هل يعني نافذة المعلومات مثل هذا?إذا كان الأمر كذلك ، هل يمكن أن تفعل شيئا بين الأسطر التالية (لاحظ GEvent.addListener() خط):

/* Geocoded Addresses
--------------------*/
var markers = [
 ["624 Nord Ave #20, Chico CA"],
 ["200 Nord Ave, Chico CA"],
 ["100 Nord Ave, Chico CA"],
 ["5th and Ivy, Chico CA"]
];

function showAddress(markers) {
 if (geocoder) {
  geocoder.getLatLng(markers,
   function(point) {
    if (!point) {
     alert(markers + " not found");
    } else {
     marker = new GMarker(point);
     GEvent.addListener(marker, 'click', function() {
      marker.openInfoWindowHtml('<strong>Awesome place</strong><br>746 Blah street<br>1337 Awesomeville');
     });
     map.addOverlay(marker);
     markers[i] = marker;
    }
   }
  );
 }
}

for (var i = 0; i < markers.length; i++) {
 showAddress(markers[i]);
}

في محاولة منه, اذهب انقر فوق علامة!:)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top