Я шукав надійне рішення, яке дозволило б мені створити веб-карту та накладати векторні багатокутники, не беручись назавжди завантажувати такі дані, щоб дозволити мені, щоб кожен полігон відображав різний колір під час події наведення.
Наскільки мені відомо, є 3 конкретні варіанти досягнення цього через канву, SVG, Flash.
Flash здається, що це було б найкращим рішенням, якби він працював на яблучних iphone / ipads, оскільки, схоже, забезпечує найшвидший показ і найчистіший дисплей. Полотно, здається, є другим найкращим вибором, але займає ДУЖЕ довго, якщо у вас сотні полігонів відображаються на карті, тоді як SVG займає ще більше часу для візуалізації.
Я майже втратив надію на пошук вирішення цієї проблеми, але сьогодні я натрапив на компанію GISCloud http://www.giscloud.com (наразі знаходиться в бета-версії з безкоштовною реєстрацією).
Цій компанії вдалося дещо розробити дивовижний спосіб відобразити сотні векторів на карті майже в режимі реального часу. Я був вражений їх підходом, і моє запитання до громади стосується того, як ми можемо повторити їх підхід для використання з існуючими технологіями, такими листівками, відкритими шарами, воском ...
Погляньте на себе, переглянувши цю дивовижну демонстрацію: http://www.giscloud.com/map/284/africa
Переконайтесь, що ви наведіть курсор на будь-який з багатокутників на сторінці і протестуйте регулятори масштабування, щоб побачити, що ці багатокутники справді є векторами.
Що я помітив, переглядаючи запити за допомогою firebug, це те, що карта запитує конкретні файли json. Здається, що залежно від рівня / області масштабування запитується кілька json-файлів.
Тут я також повинен зазначити, що після того, як giscloud завантажує дані на сторінку, що нависає над вектором, негайно змінює колір, не створюючи нового запиту.
ПРИКЛАДИ:
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/3/3.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/5/3.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/4/4.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/3/4.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/5/4.json
Я припускаю, що структура URL дотримується стандартної логіки обслуговування плитки (наприклад, третя остання папка має рівень масштабування ...).
У будь-якому випадку я проаналізував фактичні дані цих файлів json, і, схоже, логіка, яку вони використовують, дотримується певного типу логіки, за допомогою якої вони створюють свої вектори просто на основі цих значень даних:
- ширина / висота: вони визначають ширину та висоту даних, що подаються у кожному запиті json
- пікселів: тут вони визначають значення пікселів, які, я вважаю, якимось чином стосується деяких загальних координат пікселів x / y для узагальнених рівнів точок? Я здогадуюсь, що вони якось мають спосіб автоматичного спрощення регіону залежно від рівня збільшення. Я припускаю, що вони використовують піксельні координати. Я здогадуюсь, вони різко зменшують розмір даних, які потрібно завантажити, порівняно з даними lat / long.
- стилі: тут вони визначають два значення css RGB. "F", що представляє колір файлу багатокутника, і "S", що представляє колір межі полігона.
- geom: ось де я здогадуюсь, вони якимось чином конкретно визначають кожен полігон у плитці, що завантажується, де такі дані визначаються на основі вікна контейнера карт. Що також цікаво, це те, що кожен запис має значення "S", яке, я вважаю, використовується як необов'язковий атрибут або значення посилання на функцію, і в кінці кожного запису тут є область, яка, здається, визначає конкретний векторний ідентифікатор разом із ідентифікатор шару, який я здогадуюсь, використовується для того, щоб якось приєднатись до даних кожного виклику плитки json, що викликається.
Я також припускаю, що якимось чином придумали спосіб автоматичного визначення та розділення даних, які потрібно завантажити для кожної плитки, залежно від розміру даних, які потрібно буде завантажити для запитуваної плитки.
Ось вилучена розбивка одного з цих запитів:
{"width":256,"height":256,"tile":
{"pixels":
[0,6461,-1,0,5,148,0,509,-1,10715,-1,1,-1,251,-1,1,-1,1,-1,251,-2,3,-1,255,-1,249,-2,5,-2,247,-1,509,-3,251,-1,2,-2,253,-2,252,-2,254,-1,255,-1,254,-1,255,-1,1276,-2,13,-1,233,-1,2,-1,253,-1,1,-1,255,-1,247,-1,1306,-1,1533,-1,1269,-1,1276,-1,2303,-1]},
"styles":
[{"f":"rgb(99,230,101)","s":"rgb(5,148,0)","lw":"0"}],
"geom":
[
{"s":0,"p":[4,143,5,144,3,146,1,146,2,143,4,143],"c":"layer1156_5098"},
{"s":0,"p":[-2,143,0,140,2,141,2,144,1,146,-2,144,-2,143],"c":"layer1156_5067"},
{"s":0,"p":[7,143,5,144,4,143,2,143,2,141,5,138,6,139,5,141,7,143],"c":"layer1156_5051"},
{"s":0,"p":[10,141,11,137,12,137,14,137,12,142,9,143,9,142,10,141],"c":"layer1156_5041"},
{"s":0,"p":[1,136,0,140,-2,143,-2,136,1,136],"c":"layer1156_5038"},
{"s":0,"p":[8,143,5,141,5,137,8,136,10,137,10,141,8,143],"c":"layer1156_5033"},
{"s":0,"p":[5,137,2,141,0,140,1,136,1,136,2,135,3,136,5,137],"c":"layer1156_5028"},
{"s":0,"p":[10,134,12,136,11,138,8,135,10,134],"c":"layer1156_5020"},
{"s":0,"p":[-2,133,0,136,-2,136,-2,133],"c":"layer1156_5005"},
{...}
...
]
}
Як ми можемо повторити той самий (або подібний) тип швидкості за допомогою постгігів (які я, начебто, також використовую)?