如何在传单地图上以图形方式映射 JSON 数据? [英] How to map JSON data graphically on a Leaflet map?

查看:20
本文介绍了如何在传单地图上以图形方式映射 JSON 数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用 Citybik.es API (http://api.citybik.es/) 在传单地图上显示数据.

I want to use the Citybik.es API (http://api.citybik.es/) to show data on a Leaflet map.

如何从 JSON 在地图上实现这些数据?我已经从 componentDidMount() 内的 API 获取信息,但我不知道关于将这些数据放入地图.

How do implement this data on the map from JSON? I am already fetching information from the API inside a componentDidMount(), but I don't have a clue about putting this data into a map.

响应如下所示:

{
  "networks": [
{
  "company": [
    "Bike U Sp. z o.o."
  ], 
  "href": "/v2/networks/bbbike", 
  "id": "bbbike", 
  "location": {
    "city": "Bielsko-Bia\u0142a", 
    "country": "PL", 
    "latitude": 49.8225, 
    "longitude": 19.044444
  }, 
  "name": "BBBike"
}, 
{
  "company": [
    "PBSC", 
    "Alta Bicycle Share, Inc"
  ], 
  "href": "/v2/networks/melbourne-bike-share", 
  "id": "melbourne-bike-share", 
  "location": {
    "city": "Melbourne", 
    "country": "AU", 
    "latitude": -37.814107, 
    "longitude": 144.96328
  }, 
  "name": "Melbourne Bike Share"
}
}

感谢您的帮助!

import React, { Component } from 'react';
import L from 'leaflet';
import { Map, TileLayer, Marker, Popup } from 'react-leaflet';

// code for map marker icon
var myIcon = L.icon({
    iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=',
    iconSize: [25, 41],
    iconAnchor: [12.5, 41],
    popupAnchor: [0, -41]
});

class App extends Component {
    state = {
        location: {
            lat: 51.505,
            lng: -0.09,
        },
        haveUsersLocation: false,
        zoom: 2,
        networks: null
    }

    //lifecycle method to get the user's current position(if they so desire).
    componentDidMount() {

        fetch('https://api.citybik.es/v2/networks')
        .then(res => res.json())
        .then(response => {
            console.log("response", response);
            console.log(response.networks)
            const networkData = response.networks
            const networkList = networkData.map((data) => {
                console.log(data);
            })
    })


        navigator.geolocation.getCurrentPosition((position) => {
            this.setState({
               location: {
                   lat: position.coords.latitude,
                   lng: position.coords.longitude
               },
               haveUsersLocation: true,
               zoom: 13
            });
        }, () => {
            console.log('Uops! The user didnt give its location!');
            fetch('https://ipapi.co/json')
            .then(res => res.json())
            .then(location => {
                this.setState({
                    location: {
                        lat: location.latitude,
                        lng: location.longitude
                    },
                    haveUsersLocation: true,
                    zoom: 13
                 });
            })
        });
    }


    render() {
        const position = [this.state.location.lat, this.state.location.lng]
        return (
            <Map className="map" center={position} zoom={this.state.zoom}>
                <TileLayer
                    attribution="&amp;copy <a href=&quot;http://osm.org/copyright&quot;>OpenStreetMap</a> contributors"
                    url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
                />
                {
                    this.state.haveUsersLocation ? 
                    <Marker
                        position={position}
                        icon={myIcon}>
                    <Popup>
                        A pretty CSS3 popup. <br /> Easily customizable.
                    </Popup>
                </Marker> : ''
                }
            </Map>
        )
    }
}

ReactDOM.render(<App/>,
    document.getElementById('root')
);

body {
    margin: 0px;
    width: 100vw;
    height: 100vh;
}

#root {
    height: 100%;
}

.map {
    height: 100%;
}

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<link href="https://unpkg.com/leaflet@1.3.4/dist/leaflet.css" rel="stylesheet"/>
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="theme-color" content="#000000">

    <title>Leaflet map</title>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>

推荐答案

您必须渲染多个 Marker 元素.目前,如果您有当前用户的位置,您将渲染一个 Marker.以类似的方式,我们将遍历其他坐标并渲染它们.

You'll have to render multiple Marker element. Currently, you are rendering one Marker if you have the current users location. In similar fashion, we will iterate through the other co-ordinates and render them.

在您的 componentDidMount 中,将您收到的响应保存到一个状态

In your componentDidMount, save the response you receive to a state

fetch('https://api.citybik.es/v2/networks')
    .then(res => res.json())
    .then(response => {
        console.log("response", response);
        console.log(response.networks)
        const networkData = response.networks
        const networkList = networkData.map((data) => {
            this.setState({ bikeData: data });
        })
})

然后在您的 render 方法中,迭代 bikeData 并渲染 Markers.

Then inside your render method, iterate over the bikeData and render the Markers.

<Map className="map" center={position} zoom={this.state.zoom}>
            <TileLayer
                attribution="&amp;copy <a href=&quot;http://osm.org/copyright&quot;>OpenStreetMap</a> contributors"
                url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
            />
            {
                this.state.haveUsersLocation ? 
                <Marker
                    position={position}
                    icon={myIcon}>
                <Popup>
                    A pretty CSS3 popup. <br /> Easily customizable.
                </Popup>
            </Marker> : ''
            }

            {
              this.state.bikeData &&
              this.state.bikeData.networks.map((idx, data) => (
               <Marker key={data.id} position={[data.location.latitude, data.location.longitude]}> <Popup> Name: {data.name} </Popup> </Marker>))
            } 

        </Map>

这篇关于如何在传单地图上以图形方式映射 JSON 数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆