javascript - 如何使用传单在 openstreetmap 上移动标记?

标签 javascript api leaflet

我正在使用一个提供实时飞机位置的 API。

在传单中,我使用纬度和经度在 map 上显示每个平面的标记。我想在每次刷新脚本时创建一个新标记时移动标记。

setInterval(() => {
fetch("https://opensky-network.org/api/states/all")
    .then((res) => {
        return res.json();
    })
    .then((res) => {

            for (let i = 0; i < res.states.length; i++) {
                if (res.states[i][2] == 'France') {
                    if (res.states[i][5] != null || res.states[i][6] != null) {
                        posA = res.states[i][5];
                        posB = res.states[i][6];
                        marker = L.marker([posB, posA]);
                        marker.addTo(mymap);
                    }
                }

            }


    })
    .catch((err) => {
        if (err) throw err
    })
}, 3000);

我试过了但是没用:

var newLatLng = new L.LatLng(posB, posA);
marker.setLatLng(newLatLng);

最佳答案

如果给定 ICAO 的标记已经存在,您可以保留一个散列来查找,必要时创建一个标记或更新其位置。像这样的东西:

function fetchData() {
    return fetch("https://opensky-network.org/api/states/all")
        .then((res) => {
            return res.json();
        })
        .then((res) => {
            return res.states.filter((state) => {
                return (state[2] === 'France') && (state[5]) && (state[6]);
            });
        })
        .catch((err) => {
            if (err) throw err
        });
}

function plotStates(map, markers) {
    fetchData().then(function(states) {
        states.forEach((state) => {
            const lat = state[6],
                  lng = state[5],
                  icao24 = state[0];

            if (markers[icao24]) {
                markers[icao24].setLatLng([lat, lng]);
            } else {
                markers[icao24] = L.marker([lat, lng]);
                markers[icao24].addTo(map);
            }
        });
        setTimeout(() => plotStates(map, markers), 3000);
    });
}

const markers = {};
plotStates(map, markers);

还有一个演示

function fetchData() {
return fetch("https://opensky-network.org/api/states/all")
    .then((res) => {
        return res.json();
    })
    .then((res) => {
        return res.states.filter((state) => {
            return (state[2] === 'France')
              && (state[5]) && (state[6]);
        });
    })
    .catch((err) => {
        if (err) throw err
    })
}

function plotStates(map, markers) {
    fetchData().then(function(states) {
        states.forEach((state) => {
            const lat = state[6],
                  lng = state[5],
                  icao24 = state[0];

            if (markers[icao24]) {
                markers[icao24].setLatLng([lat, lng]);
            } else {
                markers[icao24] = L.marker([lat, lng]);
                markers[icao24].addTo(map);
            }
        });
        setTimeout(() => plotStates(map, markers), 3000);
    });
}

var map = L.map(document.getElementById('map')).setView([48.8583736, 2.2922926], 4);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);

L.marker([48.8583736, 2.2922926]).addTo(map);

const markers = {};
plotStates(map, markers);
html, body {
  height: 100%;
  margin: 0;
}
#map {
  width: 100%;
  height: 100%;
}
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.4/dist/leaflet.css"/>
<script src="https://unpkg.com/leaflet@1.3.4/dist/leaflet.js"></script>

<div id='map'></div>

关于javascript - 如何使用传单在 openstreetmap 上移动标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54234262/

相关文章:

javascript - 如何跟踪具有一个循环列表项提供不同参数的有序列表中的顺序

javascript - .js 未应用于 ng-view

c# - 与 NOAA API 集成

javascript - 如何允许使用 Leaflet.draw 编辑要素/多边形?

javascript - 在传单中的标记之间画线

javascript - 阻止 'JavaScript function triggering css width' 影响滚动屏幕位置(在移动设备上)

javascript - 登录 Python 和 Django 应用程序时本地服务器出现错误

java - 在 Postman 上映射<String,String> 键值

api - Trustpilot Api - 获取私有(private)产品评论始终返回未经授权的响应状态

javascript - 图表太大。如何减小 vue js 中图表的大小?