2015-02-26 2 views
2

J'ai essayé d'utiliser mapbox.js geo map dans angularjs.Mapbox.js ne fonctionne pas avec Angular.js

Carte: http://bl.ocks.org/wboykinm/c77e7c891bfc52157843#index.html

données JSON: http://bl.ocks.org/wboykinm/raw/c77e7c891bfc52157843/42d7ab5d1a432a88e905bf14705424ac40ba4480/saplaces.geojson

Quand je tente d'utiliser ce code dans AngularJS, on ne voit rien sur la page. Juste vide.

<!DOCTYPE html> 
<html lang="en-us"> 
<head> 
<title>Learn and Understand AngularJS</title> 
<meta http-equiv="X-UA-Compatible" content="IE=Edge"> 
<meta charset="UTF-8"> 
<!-- load Jquery Style --> 

<link rel="stylesheet" href="//code.jquery.com/ui/1.11.3/themes/smoothness/jquery-ui.css"> 

<!-- load bootstrap and fontawesome via CDN --> 
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" /> 

<link href='https://api.tiles.mapbox.com/mapbox.js/v1.6.3/mapbox.css' rel='stylesheet' /> 
<link href='//api.tiles.mapbox.com/mapbox.js/plugins/leaflet-markercluster/v0.4.0/MarkerCluster.css' rel='stylesheet' /> 
<link href='//api.tiles.mapbox.com/mapbox.js/plugins/leaflet-markercluster/v0.4.0/MarkerCluster.Default.css' rel='stylesheet' /> 

<style> 
    body { 
     padding: 0; 
     margin: 0; 
    } 
    html, body, #map { 
     height: 100%; 
    } 
</style> 


<!-- load jQuery, d3 and angular via CDN --> 
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script> 
<script src="https://api.tiles.mapbox.com/mapbox.js/v1.6.3/mapbox.js"> </script> 
<script src='//api.tiles.mapbox.com/mapbox.js/plugins/leaflet-markercluster/v0.4.0/leaflet.markercluster.js'> 
</script> 
<script src="//code.angularjs.org/1.3.0-rc.1/angular.min.js"></script> 
<script src="//code.angularjs.org/1.3.0-rc.1/angular-route.min.js"></script> 
<script src="//code.angularjs.org/1.3.0-rc.1/angular-resource.min.js"> </script> 


</head> 

<body ng-app="myApp"> 

    <header id="wrapper"> 
    <nav class="navbar navbar-default" style="background: #FBFAFF;"> 
     <div class="container"> 
      <div class="navbar-header"> 
       <a class="navbar-brand" href="/"> 
        <p style="margin:0;padding:0;font-weight:bold;font- size:1.05em;">Geo Map Using Mapbox</p> 
       </a> 
      </div> 

      <ul class="nav navbar-nav navbar-right small" style="font-weight:bold;font-size:1em;"> 
       <li><a href="#/geomap"><i></i> Geo Map</a> 
       </li> 
      </ul> 
     </div> 
    </nav> 
</header> 


<h2> This is main page </h2>  

<div ng-view> 
</div> 


<script> 
    var myApp = angular.module('myApp', ['ngRoute', 'ngResource']); 


    myApp.config(function ($routeProvider) { 
     $routeProvider 
      .when('/geomap', { 
       templateUrl: 'pages/geomap.html', 
       controller: 'firstController' 
      }) 

    }); 


    myApp.controller('firstController', ['$rootScope', '$scope', '$log', '$location', '$timeout', '$http', 
     function ($rootScope, $scope, $log, $location, $timeout, $http) {     

      var baseLayer = L.tileLayer('http://a.tiles.mapbox.com/v3/landplanner.map-4y9ngu48/{z}/{x}/{y}.png', { 
       maxZoom: 18 
      }); 

      // DEFINE THE CLUSTER LAYER 
      var markers = L.markerClusterGroup(); 

      $http.get('json/mapjson.json') 
       .success(function (data) {       
        console.log(data) 
        var geojson = L.geoJson(data, { 
         onEachFeature: function (feature, layer) { 
          // USE A CUSTOM MARKER 
          layer.setIcon(L.mapbox.marker.icon({ 
           'marker-symbol': 'circle-stroked', 
           'marker-color': '59245f' 
          })); 
         } 
        }); 
        markers.addLayer(geojson); 

        // CONSTRUCT THE MAP 
        var map = L.map('map', { 
         maxZoom: 9 
        }).fitBounds(markers.getBounds()); 

        baseLayer.addTo(map); 
        markers.addTo(map); 
       }) 
}]) 
</script> 
</body> 
</html> 

fichier geomap.html:

<div id="map"> 
</div> 
<p> In the map page </p> 

Je ne suis pas en mesure de le réparer. Quelqu'un peut-il s'il vous plaît fournir une idée de ce que je fais mal. J'ai également joint le snap de ma page Web.

Remarque: Également un autre petit problème. Quand j'ai essayé $ http.get pour directement l'URL 'http://bl.ocks.org/wboykinm/raw/c77e7c891bfc52157843/42d7ab5d1a432a88e905bf14705424ac40ba4480/saplaces.geojson', je reçois l'erreur d'origine croisée. J'ai donc téléchargé le json dans un fichier local et l'utiliser. Toute idée comment éviter cela.

enter image description here

+0

Sur le site de MapBox: https://www.mapbox.com/help/mapbox-with-angular/, ils recommandent la directive angulaire suivante: https: // github.com/tombatossals/angular-leaflet-directive – mg1075

Répondre

4

Le problème que vous rencontrez est que pour le moment que vous créez une nouvelle instance de L.mapbox.map, votre modèle est pas encore disponible. L'instance peut donc trouver l'élément dont elle a besoin pour construire la carte. La solution est de créer une directive qui crée votre instance de carte et il passe revient à une fonction de rappel dans votre contrôleur afin que vous puissiez l'utiliser:

Stylesheet:

body { 
    margin: 0; 
} 

body, html, .leaflet-container { 
    height: 100%; 
} 

Modèle:

<mapbox callback="callback"></mapbox> 

directive:

angular.module('app').directive('mapbox', [ 
    function() { 
     return { 
      restrict: 'EA', 
      replace: true, 
      scope: { 
       callback: "=" 
      }, 
      template: '<div></div>', 
      link: function (scope, element, attributes) { 
       L.mapbox.accessToken = 'pk.eyJ1IjoicGF1bC12ZXJob2V2ZW4iLCJhIjoiZ1BtMWhPSSJ9.wQGnLyl1DiuIQuS0U_PtiQ'; 
       var map = L.mapbox.map(element[0], 'examples.map-i86nkdio'); 
       scope.callback(map); 
      } 
     }; 
    } 
]); 

Controller:

angular.module('app').controller('rootController', [ 
    '$scope', 
    function ($scope) { 
     // Gets called when the directive is ready: 
     $scope.callback = function (map) { 
      // Map is available here to use: 
      map.setView([51.433333, 5.483333], 12); 
     }; 
    } 
]); 

Voici un exemple de travail sur Plunker: http://plnkr.co/edit/p7aWsLofWZZtADXLcWxd?p=preview (Vous n'êtes pas censé utiliser l'exemple mapid et le jeton d'utilisateur, vous devez remplacer ceux avec votre propre)

L'autre problème Cors problème que vous 're ayant n'est pas résoluble, pas tant que vous ne contrôlez pas le serveur sur lequel vous téléchargez le fichier. Si vous contrôlez le serveur, vous pouvez définir l'en-tête access-control-allow-origin pour accepter votre demande. Mais puisque vous ne contrôlez pas le serveur, vous ne pouvez pas. Il suffit de télécharger les fichiers sur votre propre serveur. Un travail autour est d'utiliser un proxy qui ajoute les bons en-têtes, mais vous devez garder à l'esprit que ce n'est pas fait pour fonctionner sur la bande passante d'autres peuples si vous n'avez pas la permission. Ils pourraient vous bloquer ou pire. S'ils voulaient que les gens exécutent des fichiers directement sur leur serveur, ils l'auraient fait pour que vous le puissiez.

est ici un peu plus d'informations sur CORS: http://en.wikipedia.org/wiki/Cross-origin_resource_sharing