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)\` }}