我一直在尝试在angularjs中使用mapbox.js地理地图。
地图:http://bl.ocks.org/wboykinm/c77e7c891bfc52157843#index.html
当我尝试在angularjs中使用该代码时,页面上看不到任何内容。只是空的。
<!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>
geomap.html文件:
<div id="map">
</div>
<p> In the map page </p>
我无法修复它。任何人都可以提供一些我在做错的地方。我还附上了我的网页。
注意:另一个小问题。当我尝试$ http.get直接输入网址&#39; http://bl.ocks.org/wboykinm/raw/c77e7c891bfc52157843/42d7ab5d1a432a88e905bf14705424ac40ba4480/saplaces.geojson&#39;时,我收到了Cross origin错误。所以我已经将json下载到本地文件中并使用它。知道如何避免这种情况。
答案 0 :(得分:4)
您遇到的问题是,在您创建L.mapbox.map
的新实例时,您的模板尚未可用。因此,实例可以找到构建地图所需的元素。解决方案是创建一个指令,该指令创建您的地图实例并将其传递回控制器中的回调函数,以便您可以使用它:
样式表:
body {
margin: 0;
}
body, html, .leaflet-container {
height: 100%;
}
模板:
<mapbox callback="callback"></mapbox>
指令:
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);
}
};
}
]);
控制器:
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);
};
}
]);
这里有一个关于Plunker的工作示例:http://plnkr.co/edit/p7aWsLofWZZtADXLcWxd?p=preview(你不应该使用示例mapid和用户令牌,你必须用你自己的替换那些)
您遇到的另一个问题是CORS问题无法解决,只要您不控制从中下载文件的服务器即可。如果我们要控制服务器,您可以设置access-control-allow-origin
标头来接受您的请求。但是,由于您没有控制服务器,因此无法做到。只需将文件下载到您自己的服务器即可。解决方法是使用代理添加正确的标题但是你必须记住,如果你没有获得许可,就不能在其他人的带宽上运行。他们可以阻止你或更糟。如果他们希望人们直接从他们的服务器上运行文件,他们就可以做到这一点。
以下是有关CORS的更多信息:http://en.wikipedia.org/wiki/Cross-origin_resource_sharing