【问题标题】:Failing to draw points obtained from geoJson on Leaflet map未能在 Leaflet 地图上绘制从 geoJson 获得的点
【发布时间】:2017-11-09 23:37:02
【问题描述】:

我必须实现一个 Android 应用程序,它在带有 Leaflet 的 WebView 中显示地图,并使用来自 JSON 的数据来绘制一些点。

这是加载到 WebView 中的 HTML 代码:

<title>Leaflet example</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" type="image/x-icon" href="docs/images/favicon.ico" />
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.0.3/dist/leaflet.css" integrity="sha512-07I2e+7D8p6he1SIM+1twR5TIrhUQn9+I6yjqD53JQjFiMf8EtC93ty0/5vJTZGF8aAocvHYNEDJajGdNx1IsQ==" crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.0.3/dist/leaflet.js" integrity="sha512-A7vV8IFfih/D732iSSKi20u/ooOfj/AGehOKq0f4vLT1Zr2Y+RX7C+w8A1gaSasGtRUZpF/NZgzSAu4/Gc41Lg==" crossorigin=""></script>

<style>
    #map {
        width: 600px;
        height: 400px;
    }
</style>

</head>
<body>

<div id='map'></div>
<script src="file:///android_asset/provaquake.js" type="text/javascript">
</script>
<script src="file:///android_asset/map.js"></script>

</body>

这是用Leaflet调用地图并绘制一条线进行测试的javascript文件:

var map = L.map('map').setView([39.74739, -105], 13);

L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', {
    maxZoom: 18,
    attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
        '<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
        'Imagery © <a href="http://mapbox.com">Mapbox</a>',
    id: 'mapbox.light'
}).addTo(map);

var myLines = [{
    "type": "LineString",
    "coordinates": [[-105, 40], [-110, 45], [-115, 55]]
}];

var myStyle = {
    "color": "#ff7800",
    "weight": 5,
    "opacity": 0.65
};

L.geoJSON(myLines, {
    style: myStyle
}).addTo(map);

provaquake.js 是一个文件,其中包含一个名为“quake”的变量,该变量使用此 geoJson 初始化: https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.geojson

我编写了这段代码来将每次地震的位置添加到地图中:

L.geoJSON(quake, {
    style: function (feature) {
        return feature.properties && feature.properties.style;
    },
    pointToLayer: function (feature, latlng) {
        return L.circleMarker(latlng, {
            radius: 8,
            fillColor: "#ff7800",
            color: "#000",
            weight: 1,
            opacity: 1,
            fillOpacity: 0.8
        });
    }
}).addTo(map);

但它似乎不起作用。

所有代码都运行良好,除了最后一条关于点的指令,我对 Leaflet 完全陌生,我不知道为什么它不绘制它们

【问题讨论】:

    标签: javascript android html leaflet geojson


    【解决方案1】:

    这是一个工作示例。我对您的代码所做的唯一更改是将 fetch 添加到 quake json 并将地图缩放设置为 3 以进行演示。仔细检查您的 quake 变量是否正确填充了地震 FeatureCollection 数据。

    var map = L.map('map').setView([39.74739, -105], 3);
    
    L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', {
      maxZoom: 18,
      attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
        '<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
        'Imagery © <a href="http://mapbox.com">Mapbox</a>',
      id: 'mapbox.light'
    }).addTo(map);
    
    var myLines = [{
      "type": "LineString",
      "coordinates": [
        [-105, 40],
        [-110, 45],
        [-115, 55]
      ]
    }];
    
    var myStyle = {
      "color": "#ff7800",
      "weight": 5,
      "opacity": 0.65
    };
    
    L.geoJSON(myLines, {
      style: myStyle
    }).addTo(map);
    
    fetch('https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.geojson')
      .then(function(res) {
        if (res.ok === true) {
          return res.json();
        } else {
          alert('Geojson request failed.');
        }
      })
      .then(function(quake) {
        L.geoJSON(quake, {
          style: function(feature) {
            return feature.properties && feature.properties.style;
          },
          pointToLayer: function(feature, latlng) {
            return L.circleMarker(latlng, {
              radius: 8,
              fillColor: "#ff7800",
              color: "#000",
              weight: 1,
              opacity: 1,
              fillOpacity: 0.8
            });
          }
        }).addTo(map);
      });
    <title>Leaflet example</title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="shortcut icon" type="image/x-icon" href="docs/images/favicon.ico" />
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.0.3/dist/leaflet.css" integrity="sha512-07I2e+7D8p6he1SIM+1twR5TIrhUQn9+I6yjqD53JQjFiMf8EtC93ty0/5vJTZGF8aAocvHYNEDJajGdNx1IsQ==" crossorigin="" />
    <script src="https://unpkg.com/leaflet@1.0.3/dist/leaflet.js" integrity="sha512-A7vV8IFfih/D732iSSKi20u/ooOfj/AGehOKq0f4vLT1Zr2Y+RX7C+w8A1gaSasGtRUZpF/NZgzSAu4/Gc41Lg==" crossorigin=""></script>
    
    <style>
      #map {
        width: 600px;
        height: 400px;
      }
    </style>
    
    </head>
    
    <body>
    
      <div id='map'></div>
      <script src="file:///android_asset/provaquake.js" type="text/javascript">
      </script>
      <script src="file:///android_asset/map.js"></script>
    
    </body>

    【讨论】:

    • 谢谢,它工作得很好,所以错误是假设地震变量已正确加载?
    • 是的,验证 quake var 中是否包含 geojson 数据,并且 provaquake.js 文件正在正确加载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    相关资源
    最近更新 更多