Google maps api 3 使用Google Maps API V3,确定标记是否位于KML层边界内
是否有办法确定标记是否已进入Kmlayer覆盖的区域?My.kml主要由一个Google maps api 3 使用Google Maps API V3,确定标记是否位于KML层边界内,google-maps-api-3,gis,kml,Google Maps Api 3,Gis,Kml,是否有办法确定标记是否已进入Kmlayer覆盖的区域?My.kml主要由一个和一组定义边界的坐标组成 我发现了一篇文章,其中描述了一些与我正在寻找的内容类似的内容,使用覆盖图创建: 该方法的优点是使用getBounds(),但我正在寻找一种使用Kmlayer边界的方法。KmlLayer似乎没有像getBounds()这样方便的函数,但我在KML文件本身中有所有可用的坐标,所以我想有一种方法可以创建我自己的getBounds()函数。我只需要一种方法来确定标记(或latlang)是否在KML文件中
和一组定义边界的坐标组成
我发现了一篇文章,其中描述了一些与我正在寻找的内容类似的内容,使用覆盖图创建:
该方法的优点是使用getBounds(),但我正在寻找一种使用Kmlayer边界的方法。KmlLayer似乎没有像getBounds()这样方便的函数,但我在KML文件本身中有所有可用的坐标,所以我想有一种方法可以创建我自己的getBounds()函数。我只需要一种方法来确定标记(或latlang)是否在KML文件中的这些坐标内
谢谢你的建议 KmlLayer上没有这样的函数。但是,如果可以提取多边形边界并创建多边形,则可以使用“贴图”API的几何体库确定该点是否位于多边形内:
有人要求我提供更多关于我如何实现这一点的细节。您可以在此处看到一个示例: 我在地图上有几个标记,我想测试它们是在边界之内还是之外。我是这样设置的:
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文件并构建一组坐标,然后将这些坐标添加到多边形的路径:属性。不幸的是,仅仅使用Google Maps API似乎无法从KML转换为多边形,但是如果我错了,有人会纠正我
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层内部或外部,您将得到一个正确或错误的测试,尽管要将KML层转换为多边形需要绕道一点。以下是如何将KML转换为Google Maps V3的一个很好的答案: 使用第三方解析器(如geoxml3或geoxml-v3)将KML呈现为本机Google Maps API v3多边形,然后使用您知道的方式。使用geoxml3的示例 给出的示例将KML转换为多边形,将地址作为输入,对其进行地理定位以获得lat/long,然后确定点所在的多边形:
现在您可以将LatLngBoundary添加到KML层
我认为这只适用于简单的KML层,但一旦加载层,就可以使用getDefaultViewport获取边界,并使用它的contains方法检查LatLng对象是否在边界内。这是一种非常简单的方法,可以检查一对坐标是否适合KML层。效果很好,我可以从KML中取出坐标,从中创建多边形,然后使用google.maps.geometry.poly.containsLocation()确定标记的位置是在边界内还是在边界外。谢谢注意,KML“getDefaultViewport()”只返回地图视口的矩形,与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);