2016-10-29 12 views
1

Openlayers 2에서 ol3으로 맵 애플리케이션을 마이그레이션 중이며 익스텐트가 변경되면 서버에 요청을 실행하는 bbox 레이어가 있습니다. 새로 고침 전략 (force : true)을 사용하고 서버는 사용자 지정 형식을 사용하여 처리하는 개체 배열을 반환합니다.Openlayers 2 Migrate Openlayers 2 BBOX 전략을 Openlayers 3

var refreshStrategy = new OpenLayers.Strategy.Refresh({ 
    force: true 
}); 

OpenLayers.Format.GTFS = OpenLayers.Class(OpenLayers.Format, { 
    read: function(body) { 
    var stops = JSON.parse(body), point, features = []; 

    for(var i=0,l=stops.length; i<l; i++) { 
     point = new OpenLayers.Geometry.Point(stops[i].stop_lon, stops[i].stop_lat); 
     features.push(new OpenLayers.Feature.Vector(point, stops[i])); 
    } 
    return features; 
    } 
}); 

var layer = new OpenLayers.Layer.Vector('Stops', { 
    projection: new OpenLayers.Projection('EPSG:4326'), 
    visibility: true, 
    strategies: [ 
    new OpenLayers.Strategy.BBOX({resFactor: 1.2}), 
    refreshStrategy 
    ], 
    protocol: new OpenLayers.Protocol.HTTP({ 
    format: new OpenLayers.Format.GTFS(), 
    url: '/api/v1/stops.json' 
    }) 
}); 

refreshStrategy.activate(); 

ol.source.Vector은 하나의 전략 만 지원합니다. 난하지만 난

var stopFeatures = new ol.Collection(); 

var source = new ol.source.Vector({ 
    features: stopFeatures, 
    loader: function(extent, resolution, projection) { 
     extent = ol.extent.applyTransform(extent, ol.proj.getTransform("EPSG:3857", "EPSG:4326")); 
     var url = '/api/stops.json?bbox=' + extent.join(','); 
     $http.get(url).then(function (res) { 
      var features = _.map(res.data, function (stop) { 
       var stopFeature = new ol.Feature(stop); 
       stopFeature.setGeometry(new ol.geom.Point(ol.proj.transform([stop.stop_lon,stop.stop_lat], 
        'EPSG:4326', 'EPSG:3857'))); 
       return stopFeature; 
      }); 
      stopFeatures.clear(); 
      stopFeatures.extend(features); 
     }); 
    }, 
    projection: 'EPSG:4326', 
    strategy: ol.loadingstrategy.bbox, 
}); 
내가 뭔가를 잘못하고 있어요 같은 기능 모음의 청산 및 재설정 느낌

를 패닝 기능 마커가 깜박 및 데이터의 모든 시간을 다시로드 얻으려면, BBOX 전략을 사용하여 시도 및 새로 고침 속도가 느린 것으로 보인다 .

이 방법을 ol3에서 구현하는 방법은 무엇입니까?

+0

실제로 OpenLayers 3.x의'ol.loadingstrategy.bbox'는 OpenLayers 2의'OpenLayers.Strategy.BBOX'와 완전히 똑같습니다. 왜 다른 괴물이라고 생각합니까? – ahocevar

+0

@ahocevar 코드를 읽고 무슨 뜻인지 이해합니다. 나에게 모호한 점은 ol2가 후드 요청의 후속 요청에서 데이터를 병합하는 방법이며 지금은 기능 컬렉션을 사용해야한다는 것입니다. 나는 재 삽입 될 가능성이있는 기능들을 제거하고 있으며 아마도 그것이 느린 것으로 생각하고있다. 어쨌든이 문제에 관심을 가져 주셔서 감사합니다. –

답변

1

맞습니다. 기능 컬렉션에서 clear()extend()으로 전화하면 안됩니다. 대신 JSON의 각 기능에 대한 고유 ID와 같은 것이 있어야합니다. 그렇지 않으면 위도와 경도에서 생성 된 해시를 사용할 수 있습니다. ID를 얻은 후에는 stopFeature.setId(id)을 사용하여 기능에서 ID를 설정하십시오. 그런 다음 source.addFeatures(features)으로 전화하십시오. 이 전략은 피처 ID와 기존 피처의 ID를 내부적으로 비교하고 이미 소스에없는 ID로만 피처를 삽입합니다.

+0

ID 설정이 더 좋습니다. 항구의 빠진 부분은 ** 새로 고침 전략 ** 부분입니다. 서버가 제한된 양을 검색하고 더 작은 bbox가 새로운 맵을 표시하기 때문에 이전 맵에서 줌인은 요청을 트리거하고 실제로 많은 기능을로드합니다. ol2에는 배열 인수가 있지만 ol3에는 단'strategy' 속성이 있습니다. –