2017-10-25 12 views
0

私はBingマップとGoogleマップの両方を使用するサイトを持っています。各機能にはBingとGoogleのバージョンがあります。 Bingマップでgoogle.maps.geometry.poly.containsLocation関数を複製する際に問題が発生しています。そんなことはありますか?Bingマップには場所機能が含まれています

基本的にポリゴンを作成し、地図上のポリゴンの内側に押しピンがあるかどうかを調べます。

答えて

3

Bing MapsのV8は、あなたが簡単に交差機能を使用するため、この計算を行うことができ、空間数学のモジュールがあります。

<!DOCTYPE html> 
<html> 
    <head> 
     <title></title> 
     <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/> 
    </head> 
    <body> 
     <div id='myMap' style='width: 100vw; height: 100vh;'></div> 
     <script type='text/javascript'> 
      function load() { 
       var map = new Microsoft.Maps.Map(document.getElementById('myMap'), { 
        credentials: 'YOUR BING MAPS KEY' 
       }); 

       //Create a polygon and location for testing.  
       var center = map.getCenter(); 
       var polygon = new Microsoft.Maps.Polygon([new Microsoft.Maps.Location(center.latitude - 0.05, center.longitude - 0.05), 
        new Microsoft.Maps.Location(center.latitude + 0.01, center.longitude - 0.05), 
        new Microsoft.Maps.Location(center.latitude + 0.01, center.longitude + 0.05)], { fillColor: 'yellow', strokeColor: 'orange', 
        strokeThickness: 5, strokeDashArray: [1, 2, 5, 10] }); 
       map.entities.push(polygon); 

       var location = new Microsoft.Maps.Location(center.latitude, center.longitude); 

       //Load the Spatial Math module 
       Microsoft.Maps.loadModule('Microsoft.Maps.SpatialMath', function() { 
        //Check to see if the shapes intersect. 
        var intersects = Microsoft.Maps.SpatialMath.Geometry.intersects(location, polygon); 

        if(intersects){ 
         alert("The location is inside in the polygon");   
        } else { 
        alert("The location is NOT inside in the polygon");   
            } 
       });  
      } 
     </script> 
     <script type='text/javascript' src='https://www.bing.com/api/maps/mapcontrol?callback=load' async defer></script> 
    </body> 
</html> 
+0

さらに良い!レスキューへの空間的な数学 –

0

Bing Maps AJAXコントロールの拡張機能を使用して独自のメソッドを追加できます。この拡張メソッドは、Microsoft.Maps.Locationクラスに配置できます。ここで

Microsoft.Maps.Location.prototype.IsInPolygon=function(polygon) 
       {   
        var isInside = false; 
        var j = 0; 
        var x = this.longitude; 
        var y = this.latitude; 
        var paths = polygon.getLocations(); 

        for (var i = 0; i < paths.length ; i++) { 
         j++; 
         if (j == paths.length) { j = 0; } 
         if (((paths[i].latitude < y) && (paths[j].latitude >= y)) || ((paths[j].latitude < y) && (paths[i].latitude >= y))) { 
          if (paths[i].longitude + (y - paths[i].latitude)/(paths[j].latitude - paths[i].latitude) * (paths[j].longitude - paths[i].longitude) < x) { 
           isInside = !isInside 
          } 
         } 
        }   

        return isInside; 
       }; 

は、Bing MapsのV8での作業例です。

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Bing Maps - V8 - Polygon test</title> 
     <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/> 
    </head> 
    <body> 
     <div id='myMap' style='width: 100vw; height: 100vh;'></div> 
     <script type='text/javascript'> 
      function load() { 
       Microsoft.Maps.Location.prototype.IsInPolygon=function(polygon) 
       {   
        var isInside = false; 
        var j = 0; 
        var x = this.longitude; 
        var y = this.latitude; 
        var paths = polygon.getLocations(); 

        for (var i = 0; i < paths.length ; i++) { 
         j++; 
         if (j == paths.length) { j = 0; } 
         if (((paths[i].latitude < y) && (paths[j].latitude >= y)) || ((paths[j].latitude < y) && (paths[i].latitude >= y))) { 
          if (paths[i].longitude + (y - paths[i].latitude)/(paths[j].latitude - paths[i].latitude) * (paths[j].longitude - paths[i].longitude) < x) { 
           isInside = !isInside 
          } 
         } 
        }   

        return isInside; 
       }; 

       var map = new Microsoft.Maps.Map(document.getElementById('myMap'), { 
        credentials: 'YOUR KEY' 
       }); 
       var center = map.getCenter(); 
       var polygon = new Microsoft.Maps.Polygon([new Microsoft.Maps.Location(center.latitude - 0.05, center.longitude - 0.05), 
        new Microsoft.Maps.Location(center.latitude + 0.01, center.longitude - 0.05), 
        new Microsoft.Maps.Location(center.latitude + 0.01, center.longitude + 0.05)], { fillColor: 'yellow', strokeColor: 'orange', 
        strokeThickness: 5, strokeDashArray: [1, 2, 5, 10] }); 
       map.entities.push(polygon); 

       var location = new Microsoft.Maps.Location(center.latitude, center.longitude); 
       alert("The location is inside in the polygon : " + location.IsInPolygon(polygon));     
      } 



     </script> 
     <script type='text/javascript' src='https://www.bing.com/api/maps/mapcontrol?callback=load' async defer></script> 
    </body> 
</html>