我有一个带有多边形特征的 google.maps.Data 图层:

state = new google.maps.Data();
state.loadGeoJson('static/geojson/ga_state.geojson', {
    idPropertyName: 'name'
});
state.setStyle({
    clickable: false,
    visible: false,
});
state.setMap(map);

在这个特征集合中是一个代表乔治亚州的多边形:
ga = state.getFeatureById('Georgia')

我可以得到这个特征的几何形状:
gaGeom = ga.getGeometry()

但是当我将这些对象中的任何一个以及原始数组传递给 google.maps.geometry.polygon.containsFeature() 时,我得到一个错误,该对象不包含 get() 函数:
google.maps.geometry.poly.containsLocation(p.getPosition(), ga)
Uncaught TypeError: b.get is not a function(…)

google.maps.geometry.poly.containsLocation(p.getPosition(), gaGeom)
Uncaught TypeError: b.get is not a function(…)

google.maps.geometry.poly.containsLocation(p.getPosition(), gaGeom.getArray())
Uncaught TypeError: b.get is not a function(…)

如何让 google.maps.Data.Polygon 转换为 google.maps.Polygon 或使用此功能?

编辑:

我找到了一种从 google.maps.Data.Polygon 构建 google.maps.Polygon 的方法:
//gaGeom is the feature.geometry from the data layer
poly = new google.maps.Polygon({paths:gaGeom.getAt(0).getArray()})

但肯定必须有一种更简洁的方式来构建 google.maps.Polygon 吗?

最佳答案

google.maps.geometry.poly.containsLocation method 接受一个点(a google.maps.LatLng )和一个多边形(a google.maps.Polygon )。


  • ga = state.getFeatureById('Georgia') 返回一个 "feature"
  • gaGeom = ga.getGeometry() 返回一个 "Geometry"
  • gaGeom.getArray() 返回一个 "Array" 的 LinearRings

  • 其中没有一个是 google.maps.Polygon。你可以从数组中创建一个 google.maps.Polygon (正如我看到你在我写这篇文章时发现的那样)。

    proof of concept

    代码:
    function initialize() {
      var map = new google.maps.Map(
        document.getElementById("map_canvas"), {
          center: new google.maps.LatLng(37.4419, -122.1419),
          zoom: 13,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        });
      var state = new google.maps.Data();
      var poly;
      state.addListener('addfeature', function(evt) {
        if (evt.feature.getId() == "Georgia") {
          var ga = state.getFeatureById('Georgia');
          var gaGeom = ga.getGeometry();
          //gaGeom is the feature.geometry from the data layer
          poly = new google.maps.Polygon({
            paths: gaGeom.getAt(0).getArray(),
            map: map,
            clickable: false
          });
        }
      });
      var infoWindow = new google.maps.InfoWindow();
      google.maps.event.addListener(map, 'click', function(evt) {
        infoWindow.setPosition(evt.latLng);
        if (google.maps.geometry.poly.containsLocation(evt.latLng, poly)) {
          infoWindow.setContent("INSIDE POLY<br>" + evt.latLng.toUrlValue(6));
        } else {
          infoWindow.setContent("OUTSIDE POLY<br>" + evt.latLng.toUrlValue(6));
        }
        infoWindow.open(map);
      });
    
      state.loadGeoJson("http://www.geocodezip.com/GeoJSON/gz_2010_us_040_00_500k.json.txt", {
        idPropertyName: 'NAME'
      });
      state.setStyle({
        clickable: false,
        visible: false,
      });
      state.setMap(map);
    
      var geocoder = new google.maps.Geocoder();
      geocoder.geocode({
        'address': "State of Georgia"
      }, function(results, status) {
        if (status === google.maps.GeocoderStatus.OK) {
          map.fitBounds(results[0].geometry.viewport);
        } else {
          alert('Geocode was not successful for the following reason: ' + status);
        }
      });
    }
    google.maps.event.addDomListener(window, "load", initialize);
    

    关于google-maps - 将 containsLocation 与 google.maps.Data.polygon 一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33249127/

    10-13 05:26