【问题标题】:With Google Maps API V3, determine if a marker is inside a KML Layer boundary使用 Google Maps API V3,确定标记是否在 KML 图层边界内
【发布时间】:2012-05-06 13:54:33
【问题描述】:

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

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

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

感谢您的任何想法!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 效果很好,我可以从 kml 中取出坐标,从中创建一个多边形,然后使用 google.maps.geometry.poly.containsLocation() 来确定位置是否标记在边界之内或之外。谢谢!
    【解决方案2】:

    我要求提供有关我如何实现此功能的更多详细信息。你可以在这里看到一个例子: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 文件并构建一组坐标,然后可以将其添加到多边形的路径:属性中。不幸的是,您似乎无法仅使用 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 图层转换为多边形需要绕道而行。

    【讨论】:

      【解决方案3】:

      这是如何将 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

      【讨论】:

        【解决方案4】:

        现在您可以将 LatLngBoundary 获取到您的 KML 层 straight from the API

        我认为这仅适用于简单的 KML 图层,但是一旦您加载了图层,您就可以使用 getDefaultViewport 获取边界并使用它的 contains 方法来检查是否存在LatLng 对象在边界内。这是检查一对坐标是否适合 KML 图层的一种极其简单的方法。

        【讨论】:

        • 注意,KML "getDefaultViewport()" 只返回地图视口的矩形,与 KML 本身无关。
        猜你喜欢
        • 2011-02-20
        • 2011-08-13
        • 2013-06-27
        • 1970-01-01
        • 2013-06-28
        • 1970-01-01
        • 2013-03-01
        • 2012-10-14
        • 1970-01-01
        相关资源
        最近更新 更多