Альтернативи OpenLayers, що підтримують більше функцій на стороні клієнта [закрито]


14

Я розглядаю різні архітектури для системи, яка в ідеалі використовуватиме візуалізацію на стороні клієнта для точкових функцій і повинна бути без плагінів. Я використовував цей додаток, розроблений у відповідь на це питання, для тестування свого ноутбука (який цілком здатний - чотирьохядерний 2,6 ГГц процесор, 4 ГБ пам'яті, не під іншим навантаженням, Firefox 8) з різною кількістю очок у OpenLayers та він помітно відстає від 500 і починає боротися понад 1000. Функції, що генеруються випадковим чином, не мають жодних обробників подій, і всі вони використовують однакову символіку.

Я очікую, що буде показано до 1000 функцій, до 10 різних символів, усі з обробниками клацання та переведення миші та на менш здатних платформах.

Я сподівався на кращу ефективність роботи клієнта, особливо після перегляду цього прикладу GIS Cloud - я знаю, що він працює інакше (HTML5 полотно проти SVG), але різниця у продуктивності дійсно вражає.

Мої ключові питання (якщо ви будете такі добрі):

  1. Чи є програма, що генерує випадкову точку, продуктивністю в інших програмах OpenLayers, які ви написали / використовували?
  2. Чи існує перевірений і безкоштовний альтернативний API веб-картографічного відображення, який підтримує WMS-сервіси (якими мені потрібно користуватися) і швидший за допомогою клієнтських функцій, не використовуючи Flash / Silverlight / будь-які інші плагіни?
  3. Будь-які інші пропозиції щодо того, що я повинен розслідувати?

В основному покладатися на рендеринг на стороні сервера - це варіант, але і я, і клієнт хотіли б уникнути цього через занепокоєння з приводу збільшення кількості користувачів та чутливості інтерфейсу користувача.


На моєму 5-річному двоядерному робочому столі 3 Гб оперативної пам’яті за допомогою цього додатка на Firefox 8 (під час завантаження дискового дистрибутива ISO 1 Гбіт) 1000 очок миттєво притягуються, не намагаючись… 10 000 займає близько 1,5 сек.
користувач2856

@LukePinner це те, що просто малювати швидко * і плавно переміщувати / масштабувати? Отримання даних і малювання функцій теж добре для мене, але в цьому полягає проблема взаємодії з картою.
tomfumb

Я просто спробував ваш додаток на моєму ipad2, і він дуже добре обробляв 1000 очок. З 10K балами спочатку потрібно кілька секунд, але потім це справляється досить добре. Якщо ви хочете, ви завжди можете підкласирувати клас шарів OL Vector та реалізувати спеціальний. Я можу навести вам один приклад.
unicoletti

Так, ніяких проблем із панорами / масштабуванням. 1К балів не дуже сповільнюється на моєму нетбуку 1.6 Гц Atom :)
користувач2856

Відповіді:


23

Відповідь на перше запитання - так . Ви використовуєте OL із досить поширеною конфігурацією. Є трюки, які ви можете використати для покращення продуктивності, я до цього звернуся пізніше.

Відповідь на питання 2 може бути (особливо що стосується швидкості). Ви можете шукати на цьому веб-сайті список альтернатив (той, який зараз спадає на думку, - « Листовка» ).

Відповідь на питання 3: почніть з вимірювання:

Я відредагував локальну копію програми, щоб рендер чітко вказаний у списку параметрів для шару "Вектор". Під час тестів я б опустив рендерінг Canvas, а потім перезавантажив сторінку експерименту іншим:

var pts = new OpenLayers.Layer.Vector("Points", {renderers: ["Canvas", "SVG", "VML"]});

Я додав таймер до функції перемальовування, щоб він віддрукував, скільки часу витратив на малювання :

function redraw() {
var start = (new Date).getTime();
[...]
var diff = (new Date).getTime() - start;
console.log("redraw completed in "+diff+"ms");

Після цього я спробував кілька запусків як на Chrome 17, так і на Firefox 8.0.1 на OSX SL, маючи 1000 та 5000 функцій. На мій подив, SVG-рендер в середньому на 20% швидший, ніж Canvas-рендерінг! (Примітка. У Windows js час не такий точний, як в OSX, тому результати можуть бути менш послідовними).

Це і ти говориш про це

це проблема взаємодії з картою

IMHO повідомляє нам, що точка доступу знаходиться у векторному режимі обробки функцій. Працюючи над моїм додатком, я нещодавно переглянув його і вирішив підкласифікувати його, а потім позбутися від усього складного коду, який не корисний для простих точок. Справді, я пішов дуже дико і навіть усунув залежність від OpenLayers.Geometry.Point і моя версія тепер працює на простих js-об'єктах з атрибутами x, y.

Ваші варіанти в порядку дескрипції вигоди / вартості:

Перший варіант - фільтрувати видимі точки на стороні сервера , конфігуруючи параметр стратегії на векторний шар, наприклад:

 strategies: [new OpenLayers.Strategy.Refresh({force:true}), new OpenLayers.Strategy.BBOX({ratio:2, resFactor: 3})],

Таким чином, коли ви збільшуєте кількість функцій, намальованих на стороні клієнта, буде обмежено ті видимі в тій мірі, а не всі.

В якості другого варіанту ви можете розглянути можливість написання індивідуального вектора / рендерера . Приклад нестандартного, швидшого втілення в життя, доступний на моїй сторінці github тут . Хоча це не підходить для всіх цілей використання, його повинно вистачити, щоб дати грубе уявлення про те, що я пропоную.

Третій варіант, коли користувач повністю зменшив масштаб, - це реалізувати якусь кластеризацію функцій на стороні сервера, щоб тісні точки об'єдналися в одну, знову зменшивши кількість залучених функцій.


Велике спасибі за детальну та ретельну відповідь. Я, швидше за все, буду дивитись на кластеризацію на стороні сервера, сподіваюся, у поєднанні зі стратегією кешування, так що операція відбувається лише в разі необхідності. Одним із варіантів для сервера є MapGuide, тому підхід до отримання та кластеризації точок може бути абсолютно індивідуальним. Я також пограю з варіантами візуалізації, щоб побачити, що це має значення.
tomfumb

1
Я додав посилання на зразок перетворення вектора / полотна, який я використовую в шахті.
unicoletti

Нічого так, що розрізнений приклад має велику зміну, це справді вражає. Я перейшов від боротьби з 1000 можливостями до польоту з 10 000
tomfumb

Я змінив перший приклад (swingley.appspot.com) для використання рендерінга OL Canvas і суцільного заповнення балів, а ефективність масштабування та панораму насправді дуже схожа на ваш TagCanvas & TagVector. Я також повторно реалізував функцію хіт-тесту, яку ви видалили у своїх модифікаціях, щоб я міг перевірити порівняльну продуктивність - підхід Tag * був приблизно на 20% швидшим при визначенні того, яка функція потрапила (з 5000). Зважаючи на значні зусилля щодо написання / оновлення користувацьких класів та подібну продуктивність (на моїх тестах), я думаю, я побачу, що може зробити OL vanilla
tomfumb

Це тому, що хіт-тест перемальовує всі функції на інше полотно, таким чином вони малюються двічі з кожним оновленням.
unicoletti

0

Використовуючи UTFGrid і TileMill, ви можете відображати необмежену кількість очок з досить хорошою продуктивністю. Відображення n випадкових точок є свого роду надуманим прикладом, який би не працював у цій ситуації або з GISCloud або будь-якою подібною магією, однак - оскільки векторні хакерські характеристики вимагають знань про повний набір даних та деяку попередню обробку: і TileMill, і GISCloud багато плитки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.