【问题标题】:Uncaught TypeError: Object #<Element> has no method 'getPosition'未捕获的类型错误:对象 #<Element> 没有方法“getPosition”
【发布时间】:2013-12-07 20:18:08
【问题描述】:

我正在尝试在地图中显示可见标记,但无法使此代码正常工作。在控制台中,它会像我期望的那样显示标记信息。

<marker name="Jolly rogers", address="1850 Scales Bend Rd" lat="41.7609" lng="-91.6574" distance="217.212"></marker>

但我得到了错误:

未捕获的 TypeError: Object # has no method 'getPosition'

我有什么问题?

 function showVisibleMarkers() {
    for (var i = 0; i < markers.length; i++) {
      console.log(markers[i]);
      if (map.getBounds().contains(markers[i].getPosition())) {
        // code to display markers
      }
    }
  }

这是创建地图的代码。

function displaymap(lat, lng, state, min, max) {

    map = new google.maps.Map(document.getElementById("mapdiv"), {
      center: new google.maps.LatLng(lat, lng),
      zoom: 7,
      mapTypeId: 'roadmap',
      panControl: true,
      zoomControl: true,
      streetViewControl: true,
      mapTypeControl: true
    });

    var infoWindow = new google.maps.InfoWindow;
    // Change this depending on the name of your PHP file
    downloadUrl("/inc/db_query.php?lat=" + lat + "&lng=" + lng + "&state=" + state + "&min=" + min + "&max=" + max, function(data) {
      var xml = data.responseXML;
      var bounds = new google.maps.LatLngBounds();
      markers = xml.documentElement.getElementsByTagName("marker");
      for (var i = 0; i < markers.length; i++) {
        var name = markers[i].getAttribute("name");
        var address = markers[i].getAttribute("address");
        if (markers[i].getAttribute("daily") === '') {
          var icon = '/img/blackdot.png';
        } else if (markers[i].getAttribute("daily") === 0) {
          var icon = '/img/greendot.png';
        } else if (markers[i].getAttribute("daily") > 0 && markers[i].getAttribute("daily") < 10) {
          var icon = '/img/bluedot.png';
        } else if (markers[i].getAttribute("daily") > 9 && markers[i].getAttribute("daily") < 20) {
          var icon = '/img/purpledot.png';
        } else if (markers[i].getAttribute("daily") > 19 && markers[i].getAttribute("daily") < 30) {
          var icon = '/img/reddot.png';
        } else if (markers[i].getAttribute("daily") > 29 && markers[i].getAttribute("daily") < 40) {
          var icon = '/img/orangedot.png';
        } else if (markers[i].getAttribute("daily") > 39 && markers[i].getAttribute("daily") < 50) {
          var icon = '/img/yellowdot.png';
        } else if (markers[i].getAttribute("daily") > 49) {
          var icon = '/img/whitedot.png';
        }
        var position = new google.maps.LatLng(
                parseFloat(markers[i].getAttribute("lat")),
                parseFloat(markers[i].getAttribute("lng")));
        var html = "<b>" + name + "</b> <br/>" + address;
        var marker = new google.maps.Marker({
          map: map,
          position: position,
          icon: icon
        });
        bindInfoWindow(marker, map, infoWindow, html);
        bounds.extend(position);
        map.fitBounds(bounds);
      }
    });
    google.maps.event.addListener(map, 'idle', function() {
      showVisibleMarkers();
    });
  }

【问题讨论】:

  • 从您的 KML 创建 google.maps.Marker 对象的代码是什么样的?
  • 抱歉,应该是 XML 而不是 KML。

标签: javascript google-maps-api-3


【解决方案1】:

您不会保留对 google.maps.Marker 对象的引用。标记数组中的 XML“标记”元素没有 getPosition 方法(google.maps.Marker 对象有)。

var gmarkers = []; // in the global scope

function showVisibleMarkers() {
   for (var i = 0; i < gmarkers.length; i++) {
     // console.log(markers[i]);
     if (map.getBounds().contains(gmarkers[i].getPosition())) {
       // code to display markers
     }
   }
}

function displaymap(lat, lng, state, min, max) {
    map = new google.maps.Map(document.getElementById("mapdiv"), {
      center: new google.maps.LatLng(lat, lng),
      zoom: 7,
      mapTypeId: 'roadmap',
      panControl: true,
      zoomControl: true,
      streetViewControl: true,
      mapTypeControl: true
    });

    var infoWindow = new google.maps.InfoWindow;
    // Change this depending on the name of your PHP file
    downloadUrl("/inc/db_query.php?lat=" + lat + "&lng=" + lng + "&state=" + state + "&min=" + min + "&max=" + max, function(data) {
      var xml = data.responseXML;
      var bounds = new google.maps.LatLngBounds();
      markers = xml.documentElement.getElementsByTagName("marker");
      for (var i = 0; i < markers.length; i++) {
        var name = markers[i].getAttribute("name");
        var address = markers[i].getAttribute("address");
        if (markers[i].getAttribute("daily") === '') {
          var icon = '/img/blackdot.png';
        } else if (markers[i].getAttribute("daily") === 0) {
          var icon = '/img/greendot.png';
        } else if (markers[i].getAttribute("daily") > 0 && markers[i].getAttribute("daily") < 10) {
          var icon = '/img/bluedot.png';
        } else if (markers[i].getAttribute("daily") > 9 && markers[i].getAttribute("daily") < 20) {
          var icon = '/img/purpledot.png';
        } else if (markers[i].getAttribute("daily") > 19 && markers[i].getAttribute("daily") < 30) {
          var icon = '/img/reddot.png';
        } else if (markers[i].getAttribute("daily") > 29 && markers[i].getAttribute("daily") < 40) {
          var icon = '/img/orangedot.png';
        } else if (markers[i].getAttribute("daily") > 39 && markers[i].getAttribute("daily") < 50) {
          var icon = '/img/yellowdot.png';
        } else if (markers[i].getAttribute("daily") > 49) {
          var icon = '/img/whitedot.png';
        }
        var position = new google.maps.LatLng(
                parseFloat(markers[i].getAttribute("lat")),
                parseFloat(markers[i].getAttribute("lng")));
        var html = "<b>" + name + "</b> <br/>" + address;
        var marker = new google.maps.Marker({
          map: map,
          position: position,
          icon: icon
        });
        gmarkers.push(marker); // <---------------------------- add this line.
        bindInfoWindow(marker, map, infoWindow, html);
        bounds.extend(position);
        map.fitBounds(bounds);
      }
    });
    google.maps.event.addListener(map, 'idle', function() {
      showVisibleMarkers();
    });
  }

【讨论】:

  • 那么我可以在我的 for 循环中遍历标记数组吗?
  • 该错误是因为您的标记数组是从您的服务器下载的xml数据。 xml 用于创建 google.maps.Marker 对象(我假设您在地图上看到),但该数组中的那些“标记”不是地图上的对象并且没有 .getPosition 方法。我的答案中代码中的 gmarkers 数组包含对 google.maps.Marker 对象的引用。
猜你喜欢
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
相关资源
最近更新 更多