【发布时间】:2020-12-09 05:46:19
【问题描述】:
如何使用 mapbox gl 地理编码器执行通用搜索? “通用”是指搜索一种地点,而不是特定地点,例如“咖啡店”。我希望能够搜索“咖啡馆”或“杂货店”或任何通用类别,并让地图在当前视口中找到的该类型的每个位置上放置一个标记。它看起来不支持通用搜索或任何返回多个结果的搜索。那是对的吗?这有点令人惊讶,因为 OpenStreetMap 似乎拥有支持这种搜索所需的数据。 我已经包含了类型:'poi' 和一个过滤器函数,如果它们的 obj.properties.category 字符串中没有“cafe”或“coffee”,它会删除潜在的结果。这减少了结果建议中的噪音,但是当用户按下 ENTER 时,结果仍然只是一个位置(无论哪个建议被突出显示)。文档示例中没有此类一般搜索的示例。
请注意,此示例已通过使用边界框将结果限制在纽约市内。另请注意,您必须插入自己的 mapboxgl.accessToken 才能使此示例正常运行。
这是一个基本的 react + mapbox gl 设置:
import React from 'react';
import mapboxgl from 'mapbox-gl';
import 'mapbox-gl/dist/mapbox-gl.css'
import Geocoder from "@mapbox/mapbox-gl-geocoder";
import "@mapbox/mapbox-gl-geocoder/dist/mapbox-gl-geocoder.css";
import './map.scss';
mapboxgl.accessToken = 'YOUR_ACCESS_TOKEN_HERE';
const nyc_bbox = [-74.04848, 40.54217, -73.72479, 41.15114]
export class Map extends React.Component {
constructor(props) {
super(props);
this.state = {
lng: -73.9392,
lat: 40.8053,
zoom: 14
};
}
componentDidMount() {
const map = new mapboxgl.Map({
container: this.mapContainer,
style: 'mapbox://styles/mapbox/streets-v11',
center: [this.state.lng, this.state.lat],
zoom: this.state.zoom,
zoomAnimation: false
});
const geocoder = new Geocoder({
accessToken: mapboxgl.accessToken,
mapboxgl: mapboxgl,
bbox: nyc_bbox,
types: 'poi'
})
map.addControl(geocoder);
}
render() {
return <div ref={el => this.mapContainer = el} className='mapContainer'/>
}
}
以及随附的 scss 文件 (./map.scss):
.mapContainer {
position: absolute;
top: 0;
right: 0;
left: 0;
bottom: 0;
}
还有 ./index.js 文件:
import React from 'react';
import ReactDOM from 'react-dom';
import { Map } from './map';
class Application extends React.Component {
constructor(props) {
super(props);
}
render() {
return <Map />
}
}
ReactDOM.render(
<Application />,
document.getElementById('app'));
谢谢。
【问题讨论】:
标签: mapbox openstreetmap geocoding mapbox-gl-js