有没有办法确定标记是否已进入KmlLayer覆盖的区域?我的.kml主要由<Polygon>
和一堆定义边界的坐标组成。
我发现有一篇文章描述的内容类似于我正在寻找的内容,使用叠加层创建:http://www.paulmcilwaine.com/api/google-maps-detecting-markers-in-a-particular-boundary
该方法具有使用getBounds()的优点,但我正在寻找一种使用KmlLayer边界执行此操作的方法。 KmlLayer似乎没有像getBounds()这样的便捷函数,但是我确实在KML文件中拥有了所有可用的坐标,所以我想在那里创建自己的坐标。 getBounds()函数。我只需要一种方法来确定标记(或latlang)是否在KML文件中的那些坐标内。
感谢您的任何想法!
答案 0 :(得分:9)
KmlLayer上没有这样的功能。但是,如果可以提取多边形边界并创建多边形,则可以使用Maps API的几何图形库来确定该点是否位于多边形内: https://developers.google.com/maps/documentation/javascript/reference#poly
答案 1 :(得分:6)
我有一个请求提供有关我如何实现这一点的更多细节。您可以在此处查看示例:http://www.usinternet.com/fiber-info/map.php
我在地图上有几个标记,我想测试它们是在边界内还是边界外。我把它们设置成这样:
var userLocation = new google.maps.LatLng(44.928633,-93.298919); //Lyndale Park
var wendysLocation = new google.maps.LatLng(44.948056,-93.282222); //Wendy's on Lake St
var userMarker = new google.maps.Marker({
position: userLocation,
map: map,
title:"Your Location",
draggable: true
});
var wendysMarker = new google.maps.Marker({
position: wendysLocation,
map: map,
title:"Wendy's on Lake St",
draggable: true
});
要创建多边形,您需要读取KML文件并构建一组坐标,然后将其添加到多边形的paths:property中。不幸的是,您似乎只能使用Google Maps API从KML转到Polygon,但如果我错了,有人会纠正我!
var sector3PillburyPleasant = new google.maps.KmlLayer('http://usinternet.com/fiber-info/kml/Sector3Pillbury-Pleasant.kml', kmlOptions);
sector3PillburyPleasant.setMap(map);
var coordsSector3PillburyPleasant = [
new google.maps.LatLng(44.91615269014508, -93.28382953316716),
new google.maps.LatLng(44.91619137463104, -93.28120338511586),
new google.maps.LatLng(44.93046751403393, -93.28114057929436),
new google.maps.LatLng(44.93046991974436, -93.28055243604703),
new google.maps.LatLng(44.94815274527994, -93.28053962401711),
new google.maps.LatLng(44.94815856171297, -93.28364017122617),
];
var polySector3PillburyPleasant = new google.maps.Polygon({
paths: coordsSector3PillburyPleasant,
strokeColor: "#FFFFFF",
strokeOpacity: 0.0,
fillColor: "#FFFFFF",
fillOpacity: 0.0
});
我从KML向下解析多边形的路径,组成路径的坐标嵌套如下:(如果要关闭路径,则不需要最后一个坐标对。)
<kml>
<Document>
<Placemark>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>
-93.28382953316716,44.91615269014508,0 -93.28120338511586,44.91619137463104,0 -93.28114057929436,44.93046751403393,0 -93.28055243604703,44.93046991974436,0 -93.28053962401711,44.94815274527994,0 -93.28364017122617,44.94815856171297,0 -93.28382953316716,44.91615269014508,0
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
</Document>
</kml>
然后我测试我的标记是否在多边形的内部或外部:
var markerIn = google.maps.geometry.poly.containsLocation(wendysMarker.getPosition(), polySector3PillburyPleasant);
var markerOut = google.maps.geometry.poly.containsLocation(userMarker.getPosition(), polySector3PillburyPleasant);
console.log(markerIn);
console.log(markerOut);
如果您在KML图层内部或外部,那么您自己会进行真假测试,尽管有一些绕道将KML图层转换为多边形。
答案 2 :(得分:5)
以下是如何将KML转换为Google Maps V3的绝佳答案:
How to Check if a Point is in KML Polygon (GIS Shapefile)
使用第三方解析器(如geoxml3或geoxml-v3)将您的KML呈现为原生Google Maps API v3多边形,然后使用您知道的方式。示例使用geoxml3
给出的示例将KML转换为多边形,将地址作为输入,对其进行地理定位以获得纬度/经度,然后确定该点所在的多边形:
http://www.geocodezip.com/geoxml3_test/v3_collection-map2e.html
答案 3 :(得分:1)
现在,您可以将LatLngBoundary转到您的KML图层straight from the API
我认为这仅适用于简单的KML图层,但是一旦加载了图层,您就可以使用 getDefaultViewport 获取边界,并使用它的 contains 方法来检查LatLng对象在边界内。这是检查一对坐标是否适合KML图层的极其简单的方法。