【问题标题】:Displaying jQuery Dynamic GeoJSON Content On LeafLet Map在 LeafLet 地图上显示 jQuery 动态 GeoJSON 内容
【发布时间】:2016-02-19 20:33:18
【问题描述】:

我希望创建一个传单地图网站:

  • 获取参数(日期范围)并按下按钮
  • 执行 SQL 查询
  • 构建查询结果的 GeoJSON 提取
  • 在传单地图上显示生成的标记

我的前三个步骤正常工作,但无法将结果添加到现有地图(底图有几个 kml 图层和使用杂食动物的叠加层,我希望在有或没有查询数据的情况下都可用)。

这里是 HTML

<input id="txtStartDate" type="text" class="date-picker/>
<input id="txtEndDate" type="text" class="date-picker/>
<input type="button" id="btnMapIt" value="Map Values" class="btn"/>

<div id="map"></div>

这里是 jQuery / JavaScript

$(document).ready(function () {

    // Layer Groups
    var layerCityBoundary = new L.LayerGroup();
    var layerCityRoads = new L.LayerGroup();

    // All KML Layer Group (details not reallt important - it works!)
    loadKMLData(layerCityBoundary, 'kml/city_boundary.kml');
    loadKMLData(layerCityRoads , 'kml/city_roads.kml');

    // Map Layers
    var mbAttr = 'Map data &copy',
        mbUrl = 'https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpandmbXliNDBjZWd2M2x6bDk3c2ZtOTkifQ._QA7i5Mpkd_m30IGElHziw';

    var grayscale = L.tileLayer(mbUrl, { id: 'mapbox.light', attribution: mbAttr }),
        streets = L.tileLayer(mbUrl, { id: 'mapbox.streets', attribution: mbAttr });

    var map = L.map('map', {
            center: [45, -80],
            zoom: 12,
            layers: [streets]
        });

    var baseLayers = {
            "Streets": streets,
            "Grayscale": grayscale
        };

    var overlays = {
            "City Boundary": layerCityBoundary ,
            "City Streets": layerCityRoads 
        };

    L.control.layers(baseLayers, overlays).addTo(map);

    //******************************************************************
    // Search Button Press
    //******************************************************************
    $('#btnMapIt').click(function () {

        var startDate = $('#txtStartDate').val();
        var endDate = $('#txtEndDate').val();

        // Run Data Handler Query
        $.ajax({
            url: "queries/dhGetMapPoints.ashx",
            contentType: "application/json; charset=utf-8",
            cache: false,
            dataType: "json",
            data: { 
                dStartDate: startDate,
                dEndDate: endDate
            },
            responseType: "json",
            success: function (geojson) {

                L.geoJson(geojson, {
                    onEachFeature: function (feature, layer) {
                        layer.bindPopup(feature.properties.name);
                    }
                }).addTo(map);

            },
            error: function () {
                alert('ERROR.');
            },
        });

    });

});

但是,如果说地图已经绘制,我会遇到问题。如何从现有地图中添加(并删除任何现有的)图层(但仍保留覆盖图层)?

【问题讨论】:

    标签: javascript jquery leaflet geojson


    【解决方案1】:

    这是我的尝试...我对 cme​​ts 进行了更改。我没有测试这个,所以第一次尝试可能不起作用。

    $(document).ready(function () {
    
    // Layer Groups
    var layerCityBoundary = new L.LayerGroup();
    var layerCityRoads = new L.LayerGroup();
    
    // All KML Layer Group (details not reallt important - it works!)
    loadKMLData(layerCityBoundary, 'kml/city_boundary.kml');
    loadKMLData(layerCityRoads , 'kml/city_roads.kml');
    
    // Map Layers
    var mbAttr = 'Map data &copy',
        mbUrl = 'https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpandmbXliNDBjZWd2M2x6bDk3c2ZtOTkifQ._QA7i5Mpkd_m30IGElHziw';
    
    var grayscale = L.tileLayer(mbUrl, { id: 'mapbox.light', attribution: mbAttr }),
        streets = L.tileLayer(mbUrl, { id: 'mapbox.streets', attribution: mbAttr });
    
    var map = L.map('map', {
            center: [45, -80],
            zoom: 12,
            layers: [streets]
        });
    
    var baseLayers = {
            "Streets": streets,
            "Grayscale": grayscale
        };
    
    //pre-create geoJson layer
    var geoJsonFeature;
    var existGeoJson = L.geoJson(geoJsonFeature, {
        onEachFeature: function (feature, layer) {
            layer.bindPopup(feature.properties.name);
        }
    });
    
    //include geoJson layer in overlays
    var overlays = {
            "City Boundary": layerCityBoundary ,
            "City Streets": layerCityRoads,
            "Existing GeoJSON": existGeoJson
        };
    
    L.control.layers(baseLayers, overlays).addTo(map);
    
    //******************************************************************
    // Search Button Press
    //******************************************************************
    $('#btnMapIt').click(function () {
    
        var startDate = $('#txtStartDate').val();
        var endDate = $('#txtEndDate').val();
    
        // Run Data Handler Query
        $.ajax({
            url: "queries/dhGetMapPoints.ashx",
            contentType: "application/json; charset=utf-8",
            cache: false,
            dataType: "json",
            data: { 
                dStartDate: startDate,
                dEndDate: endDate
            },
            responseType: "json",
            success: function (geojson) {
                //loop through your geoJson adding them to your existing layer.
                for (var i = 0; i < geoJson.length; i++) {
                var obj = geoJson[i];
                existGeoJson.addData(obj);
            }
    
    
            },
            error: function () {
                alert('ERROR.');
            },
        });
    
    });
    
    });
    

    【讨论】:

    • 这很棒(做了一些非常小的调整)。谢谢你的开始 - 但不完全是我想要的。我希望在按下按钮时将标记直接放置在地图上 - 不一定是覆盖层(我不相信用户足以知道覆盖层正在变化并且需要选择)。任何想法如何直接放置到地图上?
    • 解决了我的问题。感谢您的帮助!
    • 好交易,没问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多