react-map-gl 自定义标记不会停留在缩放时的确切位置
react-map-gl custom markers don't stay at exact position on zoom
我正在使用 Uber 的 react-map-gl 库加载 Mapbox 地图。我已经通过 API 提供的 JSON 成功加载了带有自定义标记的地图(正如您从第一张图片中看到的那样)。
不过,如果您查看休斯顿附近的绿色标记,它会出于某种原因在墨西哥湾某处偏离。但是,如果我放大那个区域...
你可以看到,当我放大时,标记会重新调整到正确的位置。什么会导致这样的事情?
import ReactMapGL, { Marker, NavigationControl, Popup } from 'react-map-gl';
import CityInfo from './city-info';
import 'mapbox-gl/dist/mapbox-gl.css';
class ExplorePage extends Component {
state = {
viewport: {
width : 400,
height : 400,
latitude : 38.789093,
longitude: -95.295881,
zoom : 3.7,
},
popupInfo: null,
};
componentDidMount() {
this.props.dispatch(explorepageActions.getFavoriteHikes());
}
_renderMarker = (marker, index) => {
return (
<Marker
anchor='bottom'
key={`marker-${index}`}
longitude={parseFloat(marker.longitude)}
latitude={parseFloat(marker.latitude)}
>
<Pin width={100} onClick={(event) => this._handleClick(event, marker)} />
</Marker>
);
};
_onViewportChange = viewport => this.setState({viewport});
render() {
const { explorepageData, loading } = this.props;
const { viewport } = this.state;
return (
<ExplorePageStyles>
{loading && <img src='/static/loading.svg' alt='loading' className='loading-img' />}
{explorepageData.data &&
<Fragment>
<Sidebar>
<ExploreSidebar favoriteHikes={explorepageData} />
</Sidebar>
<ReactMapGL
{...viewport}
mapboxApiAccessToken={MAPBOX_TOKEN}
width='100%'
height='100%'
style={{ float: 'right' }}
onViewportChange={this._onViewportChange}
attributionControl={false}
>
{explorepageData.data.map(this._renderMarker)}
{this._renderPopup()}
<div className="nav" style={navStyle}>
<NavigationControl />
</div>
</ReactMapGL>
</Fragment>
}
</ExplorePageStyles>
);
}
}
好吧,折腾了几天终于弄明白了。该问题与我对标记使用自定义图标有关。复制 example's pin 使其正常工作。
因为每次滚动时你的纬度和经度都会改变
const [viewport, setViewport] = useState({
width: '100%',
height: 240,
latitude: 41.70123,
longitude: 44.85137,
zoom: 17,
mapboxApiAccessToken: process.env.MAP_ACCESS_TOKEN
})
const [marker] = useState({
latitude: 41.70123,
longitude: 44.85137
})
<ReactMapGL className="map" {...viewport} onViewportChange={listenViewportChange}
>
<Marker {...marker}>
<img src={mapPingIcon} alt="" />
</Marker>
</ReactMapGL>
又找到一个解决方案:
let size = 40;
{cities.map(({ coordinates }) => (
<Marker
latitude={coordinates.latitude}
longitude={coordinates.longitude}
>
<div
style={{ transform: `translate(${-size / 2}px,${-size}px)` }}
onClick={(e) => {
setSelectedCity(coordinates);
}}
>
<img
src={process.env.PUBLIC_URL + '/assets/location.svg'}
alt="Location-icon"
/>
</div>
</Marker>
))}
这里最重要的是:
style={{ transform: `translate(${-size / 2}px,${-size}px)\` }}
我正在使用 Uber 的 react-map-gl 库加载 Mapbox 地图。我已经通过 API 提供的 JSON 成功加载了带有自定义标记的地图(正如您从第一张图片中看到的那样)。
不过,如果您查看休斯顿附近的绿色标记,它会出于某种原因在墨西哥湾某处偏离。但是,如果我放大那个区域...
你可以看到,当我放大时,标记会重新调整到正确的位置。什么会导致这样的事情?
import ReactMapGL, { Marker, NavigationControl, Popup } from 'react-map-gl';
import CityInfo from './city-info';
import 'mapbox-gl/dist/mapbox-gl.css';
class ExplorePage extends Component {
state = {
viewport: {
width : 400,
height : 400,
latitude : 38.789093,
longitude: -95.295881,
zoom : 3.7,
},
popupInfo: null,
};
componentDidMount() {
this.props.dispatch(explorepageActions.getFavoriteHikes());
}
_renderMarker = (marker, index) => {
return (
<Marker
anchor='bottom'
key={`marker-${index}`}
longitude={parseFloat(marker.longitude)}
latitude={parseFloat(marker.latitude)}
>
<Pin width={100} onClick={(event) => this._handleClick(event, marker)} />
</Marker>
);
};
_onViewportChange = viewport => this.setState({viewport});
render() {
const { explorepageData, loading } = this.props;
const { viewport } = this.state;
return (
<ExplorePageStyles>
{loading && <img src='/static/loading.svg' alt='loading' className='loading-img' />}
{explorepageData.data &&
<Fragment>
<Sidebar>
<ExploreSidebar favoriteHikes={explorepageData} />
</Sidebar>
<ReactMapGL
{...viewport}
mapboxApiAccessToken={MAPBOX_TOKEN}
width='100%'
height='100%'
style={{ float: 'right' }}
onViewportChange={this._onViewportChange}
attributionControl={false}
>
{explorepageData.data.map(this._renderMarker)}
{this._renderPopup()}
<div className="nav" style={navStyle}>
<NavigationControl />
</div>
</ReactMapGL>
</Fragment>
}
</ExplorePageStyles>
);
}
}
好吧,折腾了几天终于弄明白了。该问题与我对标记使用自定义图标有关。复制 example's pin 使其正常工作。
因为每次滚动时你的纬度和经度都会改变
const [viewport, setViewport] = useState({
width: '100%',
height: 240,
latitude: 41.70123,
longitude: 44.85137,
zoom: 17,
mapboxApiAccessToken: process.env.MAP_ACCESS_TOKEN
})
const [marker] = useState({
latitude: 41.70123,
longitude: 44.85137
})
<ReactMapGL className="map" {...viewport} onViewportChange={listenViewportChange}
>
<Marker {...marker}>
<img src={mapPingIcon} alt="" />
</Marker>
</ReactMapGL>
又找到一个解决方案:
let size = 40;
{cities.map(({ coordinates }) => (
<Marker
latitude={coordinates.latitude}
longitude={coordinates.longitude}
>
<div
style={{ transform: `translate(${-size / 2}px,${-size}px)` }}
onClick={(e) => {
setSelectedCity(coordinates);
}}
>
<img
src={process.env.PUBLIC_URL + '/assets/location.svg'}
alt="Location-icon"
/>
</div>
</Marker>
))}
这里最重要的是:
style={{ transform: `translate(${-size / 2}px,${-size}px)\` }}