Tương đương với layer.redraw (true) trong OpenLayers 3?


13

Tôi có một lớp Geojson trong ứng dụng OL3 mà tôi muốn vẽ lại cứ sau 5 giây (để hiển thị chuyển động trên bản đồ).

Tôi phải làm nó như thế nào ? Không thể tìm thấy tương đương với Layer.redraw ().


Bạn đã xem ol.animation? Nói chung, vẽ vector mượt mà hơn và được xử lý khác nhau trong ol3, nhưng nó không hoàn toàn rõ ràng từ câu hỏi của bạn những gì bạn muốn làm.
John Powell

@ JohnBarça - Dữ liệu GeoJson của tôi đến từ các postgres đang được cập nhật cứ sau 5 giây với dữ liệu GPS mới. Tôi muốn vẽ lại lớp để hiển thị mỗi lần vị trí hiện tại của các đơn vị trên bản đồ (nó tiếp tục thay đổi ...)
Alophind

Vì vậy, bạn đang yêu cầu dữ liệu cứ sau 5 giây sử dụng lệnh gọi setTimeout đệ quy (hoặc một cái gì đó tương tự) và bạn chỉ muốn biết làm thế nào để buộc các tính năng vectơ làm mới?
John Powell

@ JohnBarça - Nếu có một cách tốt hơn tôi sẵn sàng học hỏi, nhưng đây là những gì tôi làm, tôi muốn hiển thị vị trí của GPS trong thời gian thực trên bản đồ. GPS gửi vị trí của họ đến PostGIS và từ đó tôi đọc dữ liệu bằng GeoJSON (hoặc tôi có thể sử dụng GeoServer) nhưng tôi muốn lớp này tự cập nhật mỗi lần.
Alophind

Chắc chắn, tôi nhận được những gì bạn đang cố gắng làm. Bất kỳ cơ hội nào của một mẫu mã, bởi vì theo kinh nghiệm của tôi, nếu bạn đặt một vòng lặp hoạt hình vào giải quyết, với một cuộc gọi ajax đến một máy chủ từ xa và tải json quay lại bằng Format.GeoJSON hoặc tương tự, các tính năng sẽ được cập nhật.
John Powell

Câu trả lời:


9

Đây là cách bạn có thể làm mới nguồn vectơ cứ sau 5 giây, từ các tính năng trả về dịch vụ web trong tài liệu GeoJSON:

var vectorSource = new ol.source.Vector();
var geojsonFormat = new ol.format.GeoJSON();

window.setTimeout(function() {
  $.ajax('http://example.com/data.json', function(data) {
    var features = geojsonFormat.readFeatures(data
        {featureProjection:"EPSG:3857"});
    geojsonSource.clear();
    geojsonSource.addFeatures(features);
  });
}, 5000);

jQuery được sử dụng ở đây để yêu cầu dữ liệu thông qua Ajax ( $.ajax), nhưng rõ ràng bạn có thể sử dụng thư viện bạn chọn.

Đoạn mã này cũng giả định rằng các phép chiếu của bản đồ là "EPSG: 3857" (trình duyệt web) và tọa độ trong tài liệu GeoJSON là kinh độ và vĩ độ.


3
Mã này làm tôi bối rối, nên vectorSourcegeojsonSourceđược sáp nhập?
Kelly Thomas

Tôi nghĩ bạn có nghĩa là window.setInterval không setTimeout; nếu không thì nó chỉ làm một lần.
Jonathan

9

Tôi biết rằng câu hỏi này đã cũ nhưng cuối cùng tôi đã tìm thấy một giải pháp để làm mới một lớp trên openlayers 3.

Bạn phải cập nhật thông số của nguồn lớp như thế này:

var source = yourLayer.getSource();
var params = source.getParams();
params.t = new Date().getMilliseconds();
source.updateParams(params);

3
Dường như không phải tất cả các nguồn hỗ trợ updateParamsphương pháp; OL3.18.2 chỉ hiển thị nó cho ImageArcGISRest, ImageMapGuide, ImageWMS, TileArcGISRestTileWMS, và không cho, ví dụ như, ol.source.Vector.
Arjan

Ngày # getTime có thể tốt hơn Ngày # getMilliseconds để vô hiệu hóa bộ đệm và buộc lớp phải vẽ lại vì nó sẽ đảm bảo một số duy nhất mỗi lần.
walkermatt

5

Bạn có thể làm mới một lớp WFS với myLayer.getSource().clear().


1
Điều này đã làm điều đó cho tôi với OpenLayers 3 v. 0.14.2 và nguồn vector WFS GeoJSON.
Dirk

3
không có gì sai với câu trả lời một dòng nếu họ đang ở trên tiền. cần có một giải thưởng danh tiếng để loại bỏ hộp thông tin này.
Dennis Bauszus

1
Câu trả lời là chính xác, nhưng điều này có thể hiển thị một số nhấp nháy: khi gọi clear()bất kỳ tính năng hiện có nào sẽ bị xóa khỏi bản đồ ngay lập tức và chỉ được thêm lại sau khi nhận được phản hồi HTTP. Điều này đúng cho cả việc chỉ định một giá trị cho VectorOptions#urlvà cho VectorOptions#loader. Đối với dữ liệu thời gian thực, thủ công thực hiện một số phép thuật WebSockets hoặc XHR và sau đó gọi getSource().clear()theo sau getSource().addFeatures(...)có thể tốt hơn cho người dùng cuối.
Arjan

3

Với OL2, tôi đã sử dụng chiến lược làm mới lớp chưa được thêm vào OL3. Dưới đây là chức năng tự gọi sẽ sử dụng yêu cầu ajax để tìm nạp GeoJSON và sau đó đọc nó và thêm nó vào nguồn.

var yourSource = new ol.source.GeoJSON();

//add this source to a layer, the layer to a map with a view etc
...

//now fetch the data
var fetchData = function () {
    jQuery.ajax(url,
    {
        dataType: 'json',
        success: function (data, textStatus, jqXHR) {
            yourSource.clear(); //remove existing features
            yourSource.addFeatures(yourSource.readFeatures(data));
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log(errorThrown);
        }
    });

    //call this again in 5 seconds time
    updateTimer = setTimeout(function () {
        fetchData();
    }, 5000);
};
fetchData(); //must actually call the function!

Hi vọng điêu nay co ich.


2

Điều này hoạt động hoàn hảo cho các lớp:

layer.changed();

theo http://openlayers.org/en/latest/apidoc/ol.layer.Vector.html#changed


1
Bạn cần giải thích thêm một chút về cách layer.changed();hoạt động hoàn hảo (ly) cho các lớp. Mô tả tài liệu Increases the revision counter and dispatches a 'change' event.không thực sự hữu ích. Làm thế nào để sử dụng phương thức thay đổi () trả lời câu hỏi liên quan đến việc vẽ lại bản đồ cứ sau 5 giây?
nmtoken

Tôi đã sử dụng Ajax để lưu nguồn Geojson đã sửa đổi và vấn đề tôi gặp phải là nếu tôi đóng lớp và mở lại thì bản đồ đã sử dụng phiên bản nguồn được lưu trong bộ nhớ cache. Khi tôi xóa bộ đệm, lớp sử dụng nguồn được sửa đổi như tôi mong đợi. Thật không may, đề nghị layer.changed();không có tác dụng đối với tôi, nhưng source.changed();đã thực hiện các mẹo.
Peter Cooper

1

Không cần phải làm mới một cách rõ ràng. Mỗi khi bạn cập nhật nội dung của một lớp, bản đồ sẽ được làm mới yêu cầu hiển thị khung mới.

Để buộc kết xuất bằng tay bạn có map.render()map.renderSync()phương pháp.


Điều đó không cập nhật nội dung, chỉ cập nhật bản đồ vải.
Mapper
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.