使用Google Maps API V3,确定标记是否在KML图层边界内

Sea*_*hey 6 gis kml google-maps-api-3

有没有办法确定标记是否已进入KmlLayer覆盖的区域?我的.kml主要由<Polygon>一组定义边界的坐标组成.

我发现有一篇文章描述了一些类似于我正在寻找的文章,使用叠加创建:http://www.paulmcilwaine.com/api/google-maps-detecting-markers-in-a-particular-boundary

该方法具有使用getBounds()的优点,但我正在寻找一种方法来使用KmlLayer边界.KmlLayer似乎没有像getBounds()这样的方便函数,但是我确实在KML文件中拥有了所有可用的坐标,所以我认为有一种方法可以创建自己的getBounds()函数.我只需要一种方法来确定标记(或latlang)是否在KML文件中的那些坐标内.

谢谢你的任何想法!

Man*_*rks 10

KmlLayer上没有这样的功能.但是,如果您可以提取多边形边界并创建多边形,则可以使用Maps API的几何图形库来确定该点是否位于多边形内:https: //developers.google.com/maps/documentation/javascript/参考#聚


Sea*_*hey 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
        });
Run Code Online (Sandbox Code Playgroud)

要创建多边形,您需要读取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
            });
Run Code Online (Sandbox Code Playgroud)

我从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>
Run Code Online (Sandbox Code Playgroud)

然后我测试我的标记是否在多边形的内部或外部:

        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);
Run Code Online (Sandbox Code Playgroud)

如果你在KML层的内部或外部,你就会得到一个真或假的测试,尽管有一点绕道将KML层转变为多边形.


小智 5

以下是如何将KML转换为Google Maps V3的绝佳答案:

如何检查点是否为KML多边形(GIS Shapefile)

使用第三方解析器(如geoxml3或geoxml-v3)将KML呈现为本机Google Maps API v3多边形,然后使用您知道的方式.使用geoxml3的示例

给出的示例将KML转换为多边形,将地址作为输入,将其进行地理定位以获取纬度/经度,然后确定该点所在的多边形:

http://www.geocodezip.com/geoxml3_test/v3_collection-map2e.html