将containsLocation与google.maps.Data.polygon一起使用

时间:2015-10-21 00:43:30

标签: google-maps google-maps-api-3

我有一个带有面要素的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?

1 个答案:

答案 0 :(得分:5)

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

  

containsLocation(point:LatLng,polygon: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);