【问题标题】:Setting coordinates from openstreetmap as state将 openstreetmap 中的坐标设置为状态
【发布时间】:2020-05-18 13:43:28
【问题描述】:

我正在尝试从特定城市获取坐标并将它们设置为一个州以用作地图提供​​者。

我很确定这很愚蠢,但我在这方面花费的时间比我想承认的要多。

它有点工作,我可以设置状态,我可以控制台记录坐标,但是,它是第一个 null,null。然后是 lat,null,最后是 lat long。像这样。

null null
101.6942371 null
101.6942371 3.1516964

我想将最后两个坐标设置为状态,我认为它应该可以正常工作,但是,我想将此状态用作 lat 和 long,如下所示:

  latitude: lat,
 longitude: long,

当我这样做时,我得到“错误:必须提供longitude”。我相信这是因为它试图将 null、null 设置为坐标。

代码如下:

import React, { useState, useEffect } from "react";
import MapGL, { GeolocateControl } from "react-map-gl";
import "mapbox-gl/dist/mapbox-gl.css";
import { OpenStreetMapProvider } from "leaflet-geosearch";

const Map = (props) => {
  const [long, setLong] = useState(null);
  const [lat, setLat] = useState(null);

  const styles = {
    width: "100%",
    height: "85%",
    position: "absolute",
  };

  useEffect(() => {
    const provider = new OpenStreetMapProvider();
    const fetchData = async () => {
      const results = await provider.search({ query: props.currentCity });
      setLong(results[0].x);
      setLat(results[0].y);

    };

    console.log(long, lat)
    fetchData();
  }, [long, lat]);

  const TOKEN =
    "xxx";

  const [viewport, setViewPort] = useState({
    width: "75%",
    height: 400,
    latitude: lat,
    longitude: long,
    zoom: 12,
  });

  const _onViewportChange = (viewport) => {
    setViewPort({ ...viewport, transitionDuration: 3000 });
  };
  return (
    <div style={{ margin: "0 auto" }}>
      <MapGL
        {...viewport}
        style={styles}
        mapboxApiAccessToken={TOKEN}
        mapStyle="mapbox://styles/mapbox/streets-v9"
        onViewportChange={_onViewportChange}
      ></MapGL>
    </div>
  );
};

export default Map;

我只是将组件用作 .

谢谢

【问题讨论】:

    标签: javascript reactjs api asynchronous openstreetmap


    【解决方案1】:

    解决了。

    放弃并混合使用 mapboxgl 和 openstreetmapprovider。

    https://docs.mapbox.com/help/tutorials/use-mapbox-gl-js-with-react/

    相当愚蠢,我之前没有这样做。

    【讨论】:

      【解决方案2】:

      如果您不希望修复“provider.search()”异步函数的前 2 个状态,这可能有效:

      const fetchData = async () => {
        const results = await provider.search({ query: props.currentCity });
        if (results[0].x && results[0].y) {
          setLong(results[0].x);
          setLat(results[0].y);
          setViewPort({...viewport, 
                          latitude: results[0].y,
                          longitude: results[0].x,});
        }
      
      };
      

      您还可以这样做:

      {viewport.latitude && viewport.longitude && <MapGL
          {...viewport}
          style={styles}
          mapboxApiAccessToken={TOKEN}
          mapStyle="mapbox://styles/mapbox/streets-v9"
          onViewportChange={_onViewportChange}
        ></MapGL>}
      

      【讨论】:

      • 谢谢,但是没有,什么也没有发生。问题仍然存在。但是,我很好奇,这看起来很像我已经拥有的,除了结果[0]。这有什么意义,是什么让你相信这可能有效?我对此很陌生,所以我正在努力吸收知识。干杯! :)
      • 试图猜测流程,因为没有工作示例来解决问题......我想我有更好的理解,我已经更新了我的答案,可能更准确。
      • 我认为无论如何你都需要停止更新为“null”,其次你需要更新你的视口,因为我看到它只有在触发 onViewportChange 时才会更新(只有视口似乎包含你的坐标,但是如果没有工作示例就很难澄清),如果不起作用,您可以创建一个更简单的 JSFiddle 吗?
      • 是的。我发现这可能是由于 A,状态设置为 null,并且视口有些奇怪,正如您所说,它仅在您使用地图时才会更新。让我为你准备一个小提琴。非常感谢!
      • 已经更新了关于视口问题的答案,如果第一次设置失败,也许下一个渲染被破坏了......?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2015-10-26
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      相关资源
      最近更新 更多