从 mapbox API 获取 geoJSON 数据以确定多边形中的点
Get geoJSON data from mapbox API to determine point in polygon
我最近按照本教程确定标记显示的点是否位于定义的多边形内:https://www.mapbox.com/mapbox.js/example/v1.0.0/point-in-polygon/
效果很好,但他们使用 ajax 提取多边形 geoJSON 数据并将其应用于地图。我有一个已经绘制了多边形区域的 mapbox 地图。我正在使用他们的 API 来显示我的地图。我现在需要访问 geoJSON 数据以确定一个点是否在一个区域内。如何通过 API?
访问该数据
以下是我如何拉入地图、geoJSON 和一个函数来测试某个点是否在 geoJSON 区域中:
//mapbox connection
var mapID = "<map-id>";
L.mapbox.accessToken = "<my-token>";
//init map
var map = L.mapbox.map("mapData", mapID, {
attributionControl: false,
zoomControl: false
}).setView([53.799, -1.548], 13, {
pan: { animate: true },
zoom: { animate: true }
});
//get geoJSON
var geoJson;
$http.get("https://a.tiles.mapbox.com/v4/" + mapID + "/features.json?access_token=" + L.mapbox.accessToken).success(function(data){
geoJson = data;
});
//determine point in polygon
function determinePointInPolygon(){
var coords = [-1.3, 5.2];
var layer = leafletPip.pointInLayer(coords, L.geoJson(geoJson), true);
if (!layer.length) //point not in polygon
else //point is in polygon
}
您可以在将 JSON 拉入时将其存储在其他地方:
首先定义一个你想全局存储它的对象:
var geoJSON;
然后你拉进来的时候,用数据定义就可以了
$.ajax({
url: '/mapbox.js/assets/data/us-states.geojson',
dataType: 'json',
success: function load(d) {
geoJSON = d; // THIS IS THE LINE I ADDED
var states = L.geoJson(d).addTo(map);
L.marker([38, -102], {
icon: L.mapbox.marker.icon({
'marker-color': '#f86767'
}),
draggable: true
}).addTo(map)
.on('dragend', function(e) {
var layer = leafletPip.pointInLayer(this.getLatLng(), states, true);
if (layer.length) {
state.innerHTML = '<strong>' + layer[0].feature.properties.name + '</strong>';
} else {
state.innerHTML = '';
}
});
}
});
集成功能加载到 L.mapbox.featureLayer
中,可作为 L.mapbox.Map
实例的成员使用。假设您将地图实例存储在名为 map
的引用中,您的图层将是 map.featureLayer
:
// Make sure the featureLayer is ready
map.featureLayer.on('ready', function (e) {
// Loop over the features
e.target.eachLayer(function (layer) {
// Do your thing
// here "layer" holds an instance of the marker/polygon/polyline
// "layer.feature" holds the actual geojson feature
});
});
这是一个概念示例:http://plnkr.co/edit/D5IfRTLV0yXTqOmzNCYA?p=preview
如果您愿意,您也可以单独加载图块和要素,实例化您的地图没有 mapid
:
var map = L.mapbox.map('mapbox', null, {
'center': [0, 0],
'zoom': 1
});
var tileLayer = L.mapbox.tileLayer('yourMapId').addTo(map);
var featureLayer = L.mapbox.featureLayer('yourMapId').addTo(map);
示例:http://plnkr.co/edit/9pYeRu6UmxuVL1TLzwPR?p=preview
那么你可以省略 addTo
方法,先处理你的要素,然后将图层添加到地图:
var featureLayer = L.mapbox.featureLayer('yourMapId');
// Make sure the featureLayer is ready
featureLayer.on('ready', function (e) {
// Loop over the features
e.target.eachLayer(function (layer) {
// Do your thing
});
// Add layer to the map
e.target.addTo(map);
});
什么最适合你。但是我差点忘了实际回答你的问题(虽然我认为你不再需要这个了),实际的 GeoJSON featurecollection 可以通过使用 L.mapbox.FeatureLayer
的 getGeoJSON
方法获得(仅当层当然准备好了):
// Make sure the featureLayer is ready
featureLayer.on('ready', function (e) {
// Fetch you featurecollection
var geojson = e.target.getGeoJSON();
});
我最近按照本教程确定标记显示的点是否位于定义的多边形内:https://www.mapbox.com/mapbox.js/example/v1.0.0/point-in-polygon/
效果很好,但他们使用 ajax 提取多边形 geoJSON 数据并将其应用于地图。我有一个已经绘制了多边形区域的 mapbox 地图。我正在使用他们的 API 来显示我的地图。我现在需要访问 geoJSON 数据以确定一个点是否在一个区域内。如何通过 API?
访问该数据以下是我如何拉入地图、geoJSON 和一个函数来测试某个点是否在 geoJSON 区域中:
//mapbox connection
var mapID = "<map-id>";
L.mapbox.accessToken = "<my-token>";
//init map
var map = L.mapbox.map("mapData", mapID, {
attributionControl: false,
zoomControl: false
}).setView([53.799, -1.548], 13, {
pan: { animate: true },
zoom: { animate: true }
});
//get geoJSON
var geoJson;
$http.get("https://a.tiles.mapbox.com/v4/" + mapID + "/features.json?access_token=" + L.mapbox.accessToken).success(function(data){
geoJson = data;
});
//determine point in polygon
function determinePointInPolygon(){
var coords = [-1.3, 5.2];
var layer = leafletPip.pointInLayer(coords, L.geoJson(geoJson), true);
if (!layer.length) //point not in polygon
else //point is in polygon
}
您可以在将 JSON 拉入时将其存储在其他地方:
首先定义一个你想全局存储它的对象:
var geoJSON;
然后你拉进来的时候,用数据定义就可以了
$.ajax({
url: '/mapbox.js/assets/data/us-states.geojson',
dataType: 'json',
success: function load(d) {
geoJSON = d; // THIS IS THE LINE I ADDED
var states = L.geoJson(d).addTo(map);
L.marker([38, -102], {
icon: L.mapbox.marker.icon({
'marker-color': '#f86767'
}),
draggable: true
}).addTo(map)
.on('dragend', function(e) {
var layer = leafletPip.pointInLayer(this.getLatLng(), states, true);
if (layer.length) {
state.innerHTML = '<strong>' + layer[0].feature.properties.name + '</strong>';
} else {
state.innerHTML = '';
}
});
}
});
集成功能加载到 L.mapbox.featureLayer
中,可作为 L.mapbox.Map
实例的成员使用。假设您将地图实例存储在名为 map
的引用中,您的图层将是 map.featureLayer
:
// Make sure the featureLayer is ready
map.featureLayer.on('ready', function (e) {
// Loop over the features
e.target.eachLayer(function (layer) {
// Do your thing
// here "layer" holds an instance of the marker/polygon/polyline
// "layer.feature" holds the actual geojson feature
});
});
这是一个概念示例:http://plnkr.co/edit/D5IfRTLV0yXTqOmzNCYA?p=preview
如果您愿意,您也可以单独加载图块和要素,实例化您的地图没有 mapid
:
var map = L.mapbox.map('mapbox', null, {
'center': [0, 0],
'zoom': 1
});
var tileLayer = L.mapbox.tileLayer('yourMapId').addTo(map);
var featureLayer = L.mapbox.featureLayer('yourMapId').addTo(map);
示例:http://plnkr.co/edit/9pYeRu6UmxuVL1TLzwPR?p=preview
那么你可以省略 addTo
方法,先处理你的要素,然后将图层添加到地图:
var featureLayer = L.mapbox.featureLayer('yourMapId');
// Make sure the featureLayer is ready
featureLayer.on('ready', function (e) {
// Loop over the features
e.target.eachLayer(function (layer) {
// Do your thing
});
// Add layer to the map
e.target.addTo(map);
});
什么最适合你。但是我差点忘了实际回答你的问题(虽然我认为你不再需要这个了),实际的 GeoJSON featurecollection 可以通过使用 L.mapbox.FeatureLayer
的 getGeoJSON
方法获得(仅当层当然准备好了):
// Make sure the featureLayer is ready
featureLayer.on('ready', function (e) {
// Fetch you featurecollection
var geojson = e.target.getGeoJSON();
});