代码之家  ›  专栏  ›  技术社区  ›  mblais29

基于当前边界框将GeoJSON层从Geoserver加载到Leaflet Map

  •  5
  • mblais29  · 技术社区  · 10 年前

    目前,我的地图有超过25000个点。当我加载所有点时,地图非常慢。因此,我希望仅在特定缩放级别和边界框(用户视图)加载数据。我如何使用当前代码实现这一点?

    var map = new L.Map('map', {center: new L.LatLng(54.0000, -125.0000), zoom: 5});
      var googleLayer = new L.Google('ROADMAP');      
      map.addLayer(googleLayer);
    
    function BoundingBox(){
    var bounds = map.getBounds().getSouthWest().lng + "," +     map.getBounds().getSouthWest().lat + "," + map.getBounds().getNorthEast().lng + "," + map.getBounds().getNorthEast().lat;
    return bounds;
    }
    var geoJsonUrl ="http://localhost:8080/geoserver/Wells/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=Wells:bc_well_data_wgs&maxFeatures=25&outputFormat=text/javascript&format_options=callback:loadGeoJson"; 
    
    var geojsonLayerWells = new L.GeoJSON();
    
    function loadGeoJson(data) {
    console.log(data);
    geojsonLayerWells.addData(data);
    };
    
    $.ajax({ 
        url: geoJsonUrl, 
        dataType : 'jsonp',
        success: loadGeoJson
        });
    
    
    map.on('moveend', function(){
    
        if(map.getZoom() >= 18){
    
            map.removeLayer(geojsonLayerWells);
    
            }
        if(map.getZoom() < 18){
            map.addLayer(geojsonLayerWells);
            }
            console.log(map.getZoom());
            console.log(BoundingBox());
        });
    
    5 回复  |  直到 10 年前
        1
  •  10
  •   mblais29    10 年前

    这就是我如何解决它,改变周围的一切。

    var wellmaxzoom = 11;       
    var geojsonLayerWells = new L.GeoJSON();
    
    function loadGeoJson(data) {
        console.log(data);
        geojsonLayerWells.addData(data);
        map.addLayer(geojsonLayerWells);
    };
    
    map.on('moveend', function(){
     if(map.getZoom() > wellmaxzoom){
        var geoJsonUrl ='http://localhost:8080/geoserver/cite/ows'; 
        var defaultParameters = {
            service: 'WFS',
            version: '1.0.0',
            request: 'getFeature',
            typeName: 'cite:bc_well_data_wgs',
            maxFeatures: 3000,
            outputFormat: 'application/json'
            };
    
        var customParams = {
            bbox: map.getBounds().toBBoxString(),
            };
        var parameters = L.Util.extend(defaultParameters, customParams);
        console.log(geoJsonUrl + L.Util.getParamString(parameters));
    
        $.ajax({
            url: geoJsonUrl + L.Util.getParamString(parameters),
            datatype: 'json',
            jsonCallback: 'getJson',
            success: loadGeoJson
            });
        }else{
        map.removeLayer(geojsonLayerWells);
        };
    });
    
        2
  •  2
  •   simogeo    10 年前

    WFS没有缩放级别或比例的概念,即WMS,但它支持基于bbox加载数据子集(参见WFS示例)。

    也就是说GeoServer不支持JSon for WMS,请参见 http://docs.geoserver.org/latest/en/user/services/wms/outputformats.html#wms-output-formats

    不过,这可能是一件好事。

    西蒙。

        3
  •  1
  •   xjlin0    9 年前

    这适用于具有传单0.7.3的GeoServer 2.6.2。顺便说一句,以下SF城市的bbox数是通过Leaflet的原生函数获得的

    var yourMap = L.map('map').setView([37.7749295, -122.4194155], 17);
    yourMap.getBounds().toBBoxString();
    

    无限制:(返回许多) http://localhost:8080/geoserver/topp/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=topp:states&maxFeatures=50&outputFormat=application/json

    具有地图边界限制(返回当前覆盖) http://localhost:8080/geoserver/topp/ows?service=wfs&version=1.0.0&request=GetFeature&typeName=topp:states&bbox=-122.42553591728209,37.77453948196016,-122.4133050441742,37.775319671408&outputFormat=application/json

        4
  •  0
  •   SSA    10 年前

    你的代码看起来不错。只需在url中传递bbox。

    var bbox = BoundingBox();
    
    var geoJsonUrl ="http://localhost:8080/geoserver/Wells/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=Wells:bc_well_data_wgs&maxFeatures=25&outputFormat=json&bbox="+bbox+"&format_options=callback:loadGeoJson";
    
        5
  •  0
  •   mblais29    10 年前

    这就是我想到的,当我检查加载了多少个对象时,它显示为4000,这意味着它也加载了边界框之外的所有对象。。。。

    //loads the google map
    var map = new L.Map('map', {center: new L.LatLng(54.0000, -125.0000), zoom: 5});
      var googleLayer = new L.Google('ROADMAP');      // Possible types: SATELLITE,        ROADMAP, HYBRID
      map.addLayer(googleLayer);
    
    
    //Gets the current bounding box lat and long
    
    function BoundingBox(){
    var bounds = map.getBounds().getSouthWest().lng + "," + map.getBounds().getSouthWest().lat + "," + map.getBounds().getNorthEast().lng + "," + map.getBounds().getNorthEast().lat;
    return bounds;
    }
    
    //loads the well markers
    wellmaxzoom = 8;
    var geoJsonUrl ="http://localhost:8080/geoserver/cite/ows? service=WFS&version=1.0.0&request=GetFeature&typeName=cite:bc_well_data_wgs&maxFeatures=4000&outputFormat=application/json";
    
    var geojsonLayerWells = new L.GeoJSON();
    
    function loadGeoJson(data) {
    console.log(data);
    geojsonLayerWells.clearLayers();
    geojsonLayerWells.addData(data);
    };
    
    $.ajax({ 
        url: geoJsonUrl + "&bbox=" + BoundingBox(),
        dataType : 'json',
        jsonpCallback: 'loadGeoJson',
        success: loadGeoJson,
        });
    
    map.on('moveend', function(){
    
        if(map.getZoom() > wellmaxzoom){
            map.addLayer(geojsonLayerWells);
            }
            console.log(map.getZoom());
            console.log(BoundingBox());
        });