Більше

Створення маршрутизованого графіка із шейп-файлу Point і Line за допомогою Networkx?

Створення маршрутизованого графіка із шейп-файлу Point і Line за допомогою Networkx?


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

Чи можна знайти найкоротший шлях між усіма джерелами та пунктами призначення, використовуючи посилання у файлі шейп-файлу?

Я в основному використовую для своєї роботи Python, Networkx та QGIS, тому було б чудово використовувати ці інструменти для цього завдання.


Складніше вирішити початкову проблему - це спільна реєстрація даних точок у вашій мережі. Ці дані могли надходити з різних джерел, і тому слід очікувати певної позиційної помилки. За відсутності більш складних правил, що регулюють порядок розташування точок у мережі, ви можете використовувати найближчу точку в мережі до кожного джерела / пункту призначення, як показано у цій існуючій відповіді. Проблема тут полягає у пошуку найближчого місця по лінії, а не лише найближчої вершини:

Після того, як ви зробите цей крок, ви повинні мати свою оригінальну мережу та нещодавно зареєстровані точки. Звідти ви можете використовувати функцію nx_shp NetworkX, щоб імпортувати шейп-файл у графічну модель.

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


QGIS 1.8 має вбудований клас під назвою qgis.networkanalysis, він має функції прив'язки точок до ліній та обчислення найкоротшого шляху.


Читання shp за допомогою networkx, паралельні ребра відсутні атрибути

Я намагаюся використовувати networkx.read_shp для створення MultiGraph з файлу фігури. Я розумію, що функцію потрібно модифікувати, оскільки вона зазвичай створює DiGraph, який я намагаюся зробити, спробувавши це:

Решта функції залишається незмінною. Під час перевірки eges я бачу, що коли є паралельні ребра, один із них, здається, має порожній словник замість атрибутів (незважаючи на те, що вони присутні у файлі шейп-файлів). Я вже бачив подібне запитання, але, схоже, він використовує застарілу версію networkx. Чи є спосіб зробити мультиграф, який має паралельні ребра зі своїми атрибутами? Я бачив цю відповідь NetworkX - Як створити MultiDiGraph з Shapefile? але це для спрямованого, я можу спробувати перетворити його після, але якщо рішення є більш прямим, воно буде вдячне.


TypeError: unhashable type: & # 39LineString & # 39 при використанні ox.simplify_graph ()

У мене є набір даних, з якого я побудував сумісний з NetworkX графік. Файл шейп-файлу перетворений у словники для вузлів та ребер, який потім перетворено у GeoDataFrame. Відтепер я використовував ox.graph_from_gdfs () для створення функціонуючого графіка. Край GeoDataFrame виглядає приблизно так (перший рядок, спрощений):

тоді як вузол GeoDataFrame виглядає так:

Перетворення їх у MultiDiGraph не повертає помилок:

Ті ж дані також повертаються при перетворенні назад із графіка в gdfs.

Однак при спрощенні G виникає така помилка:

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

Ось простий код для відтворення помилки

Я підозрюю, що є кілька продубльованих вузлів з різними ідентифікаторами (див. X, y для 111603 та 111604). Можливо, в цьому може бути проблема?


Мережевий аналіз на Python¶

Пошук найкоротшого шляху за допомогою конкретної вуличної мережі є поширеною проблемою ГІС, яка має багато практичних застосувань. Наприклад, навігатори - це одна з тих «повсякденних» програм, де маршрутизація за допомогою конкретних алгоритмів використовується оптимальний шлях між двома (або кількома) точками.

Також можливо виконати аналіз мережі, такий як транспортаційна маршрутизація в Python. Networkx - це модуль Python, який надає інструменти для аналізу мереж різними різними способами. Він також містить такі алгоритми, як алгоритм Дейкстри або алгоритм A *, які зазвичай використовуються для пошуку найкоротших шляхів уздовж транспортної мережі.

Для того, щоб мати можливість проводити аналіз мережі, звичайно, необхідно мати мережу, яка використовується для аналізу. Пакет OSMnx, який ми щойно вивчали в попередньому навчальному посібнику, робить дуже простим отримання маршрутизованих мереж з OpenStreetMap з різними режимами транспорту (ходьба, їзда на велосипеді та їзда). OSMnx також поєднує деякі функціональні можливості модуля networkx, щоб спростити проведення маршрутизації за даними OpenStreetMap.

Далі ми перевіримо функціональність маршрутизації OSMnx, знайшовши найкоротший шлях між двома точками на основі проїжджих доріг. З невеликими модифікаціями можна також повторити аналіз для вулиці, що проходить.


Створення маршрутизованого графіка із шейп-файлу Point і Line за допомогою Networkx? - Геоінформаційні системи

Це один із 100+ безкоштовних рецептів Кулінарної книги IPython, Друге видання, від Сіріл Россант, посібника з числових обчислень та науки про дані в Блокноті Юпітера. Електронну книгу та друковану книгу можна придбати у видавництві Packt.

14.7. Створення планувача маршруту для дорожньої мережі

У цьому рецепті ми спираємось на декілька методів, описаних у попередніх рецептах, щоб створити простий GPS-подібний планувальник маршрутів у Python. Ми отримаємо дані дорожньої мережі Каліфорнії з Бюро перепису населення США, щоб знайти найкоротші шляхи на графіку дорожньої мережі. Це дозволить нам відображати маршрути руху між будь-якими двома пунктами в Каліфорнії.

Для цього рецепта вам потрібен Смопі. Ви можете встановити його за допомогою pip install git + https: //github.com/rossant/smopy. Щоб NetworkX читав набори даних Shapefile, вам також потрібен GDAL / OGR. Ви можете встановити його за допомогою conda install gdal.

На момент написання цієї статті gdal, здається, не працює добре з conda та Python 3.6. Можливо, вам доведеться знизити Python до Python 3.5 за допомогою conda install python = 3.5.

  1. Ми завантажуємо дані (набір даних Shapefile) за допомогою NetworkX. Цей набір даних містить детальну інформацію про основні дороги в Каліфорнії. Функція read_shp () NetworkX повертає графік, де кожен вузол є географічним положенням, а кожне ребро містить інформацію про дорогу, що зв’язує два вузли. Дані надходять з веб-сайту Бюро перепису населення США за адресою http://www.census.gov/geo/maps-data/data/tiger.html.
  1. Цей графік не обов'язково пов'язаний, але нам потрібен пов'язаний графік для обчислення найкоротших шляхів. Тут ми беремо найбільший підключений підграф за допомогою функції connected_component_subgraphs ():
  1. Ми визначаємо дві позиції (з широтою та довготою) і знаходимо найкоротший шлях між цими двома позиціями:
  1. Кожен край на графіку містить інформацію про дорогу, включаючи список точок вздовж цієї дороги. Спочатку ми створюємо функцію, яка повертає цей масив координат для будь-якого ребра на графіку:
  1. Ми можемо особливо використовувати дорожню стежку для обчислення її довжини. Спочатку нам потрібно визначити функцію, яка обчислює відстань між будь-якими двома точками в географічних координатах:
  1. Ми оновлюємо наш графік, обчислюючи відстань між будь-якими двома підключеними вузлами. Ми додаємо цю інформацію з атрибутом distance ребер:
  1. Останнім кроком, перш ніж ми зможемо знайти найкоротший шлях на графіку, є пошук двох вузлів на графіку, які є найближчими до двох запитуваних позицій:
  1. Тепер для обчислення найкоротшого шляху між нашими двома позиціями ми використовуємо функцію shortest_path () NetworkX. Ми уточнюємо, що вагою кожного краю є довжина дороги між ними:
  1. Маршрут розраховано. Змінна path містить список ребер, які утворюють найкоротший шлях між нашими двома позиціями. Тепер ми можемо отримати інформацію про маршрут з пандами. Набір даних має декілька сфер інтересу, включаючи назву та тип (штат, міждержавний та ін.) Доріг:

Ось загальна тривалість цього маршруту:

  1. Наш шлях містить підключені вузли на графіку. Кожне ребро між двома вузлами характеризується переліком точок (що складають частину дороги). Отже, нам потрібно визначити функцію, яка об’єднує позиції вздовж кожного ребра шляху. Ми маємо об’єднати позиції у правильному порядку на нашому шляху. Ми вибираємо порядок, виходячи з того, що остання точка в ребрі повинна бути близько до першої точки в наступному ребрі:

Ми обчислили найкоротший шлях за допомогою функції Shorttest_path () від NetworkX. Тут ця функція використана Алгоритм Дейкстри. Цей алгоритм має широкий спектр застосувань, наприклад, в протоколах мережевої маршрутизації.

Існують різні способи обчислення географічної відстані між двома точками. Тут ми використали відносно точну формулу: ортодромна відстань (також називається відстань великого кола), який передбачає, що Земля є досконалою сферою. Ми також могли використати простішу формулу, оскільки відстань між двома послідовними точками на дорозі невелика.

Ви можете знайти більше інформації про проблеми з найкоротшим шляхом та алгоритм Дейкстри в наступних посиланнях:


Модулі корпоративної співпраці та потужні модулі аналізу журналів

Бібліотека Java з відкритим кодом для онлайн-та офлайн-співставлення карт із OpenStreetMap. Разом із великим набором геометричних та просторових функцій, структурою даних карти в пам'яті та основними функціями машинного навчання, вона є універсальною основою для масштабованих послуг на основі місцезнаходження та просторово-часового аналізу даних на карті. Він розроблений для використання в паралельних та розподілених системах і, отже, включає автономний сервер зіставлення карт і може використовуватися в розподілених системах для служб узгодження карт у хмарі. Barefoot складається з бібліотеки програмного забезпечення та (на базі Docker) сервер карт, який забезпечує доступ до даних мап вулиць з OpenStreetMap і є гнучким для використання в розподілених хмарних інфраструктурах як сервер картографічних даних або паралельно з автономними серверами Barefoot для роботи в автономному режимі (сервер збігів) та онлайн-зіставлення карт (сервер відстеження) або для інших програм, побудованих за допомогою бібліотеки Barefoot. Доступ до картографічних даних забезпечується швидкою та гнучкою структурою даних карт в пам'яті. Разом з GeographicLib [1] та геометричним API ESRI [2], він забезпечує широкий набір географічних та геометричних операцій для аналізу просторових даних на карті.


Magellan - розподілений механізм виконання геопросторової аналітики великих даних. Він реалізований поверх Apache Spark і глибоко використовує сучасні методи баз даних, такі як ефективне розміщення даних, генерація коду та оптимізація запитів, з метою оптимізації геопросторових запитів. Розробник додатка пише стандартні запити sql або фреймів даних для оцінки геометричних виразів, тоді як механізм виконання дбає про ефективне розміщення даних у пам'яті під час обробки запитів, вибір правильного плану запиту, оптимізацію виконання запиту за допомогою дешевих та ефективних просторових індексів під час представлення декларативна абстракція розробнику.

GoJS - це бібліотека JavaScript і TypeScript для створення та керування діаграмами, діаграмами та графіками. GoJS - це гнучка бібліотека, яка може бути використана для створення ряду різних видів інтерактивних діаграм, включаючи візуалізацію даних, інструменти малювання та редактори графіків. Є зразки для блок-схеми, організаційної діаграми, бізнес-процесів BPMN, плаваючих планів, часових шкал, державних діаграм, канбана, мережі, мапи розуму, мавп, сімейних дерев та діаграм генограм, діаграм риб’ячої кістки, планів поверхів, UML, дерев рішень, діаграм пертів, Ганта, і ще сотні. GoJS включає в себе ряд вбудованих макетів, включаючи макет дерева, спрямований зусиллям, радіальний і шаруватий макет діаграми, а також ряд прикладів макетів.


Відсутні розділи та зворотні рухи в STMATCH # 70

Привіт,
Я використовую API python (скомпільований на python3) та STMATCH.
Все виглядає багатообіцяючим, однак, я не отримую ідеальних збігів даних: або отримую відсутні посилання, або непотрібні зворотні рухи (та / або обидва).

Я створив окремий приклад поведінки тут:
https://github.com/cweber9843/test_fmm/blob/master/test_fmm_on_synthetic_data.ipynb
Включаючи варіацію параметрів та перевірку мережі.

  • Який найкращий спосіб налаштувати параметри?
  • Може, побудувати навколо них мінімайзер? Якийсь градієнтний пошук?
  • Як можна уникнути зворотних рухів?
  • Як можна гарантувати пов’язаний матч?
  • Чи є який-небудь папір для алгоритму STMATCH?
  • У документі FMM згадується покарання за уникнення зворотного руху. Це все ще реалізовано?
  • Чи дасть FMM з попередньо розрахованим файлом UBODT кращі результати?
  • Як здійснюється візуалізація мережі (наприклад, тут: # 30)? Це плагін QGis?
  • будь-які інші підказки?

Текст успішно оновлено, але виявлені такі помилки:

На даний момент ми не можемо перетворити завдання на проблему. Будь ласка спробуйте ще раз.

Випуск успішно створено, але наразі ми не можемо оновити коментар.

Cyang-kth прокоментував 14 травня 2020 р. & # 8226

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

Навчання гіперпараметрично краще застосовувати зовні до поточної програми.

Або ви виконуєте попередню обробку, щоб згладити траєкторію, щоб усунути зворотний рух (як приклад, який ви показуєте), або (насправді модифікуйте програму) це головним чином спричинено припущенням, що транспортний засіб повинен рухатися вздовж напрямку краю. (Один із способів - додати допуск на зворотний рух)

Збіг не вдається, якщо шлях неможливо підключити (у прикладі, я думаю, що деякі краї мережі можуть бути спрямовані, а не двонаправлені.).

Стаття тут https://dl.acm.org/doi/abs/10.1145/1653771.1653820
Lou Y, Zhang C, Zheng Y та ін. Зіставлення карт для траєкторій GPS з низькою частотою дискретизації [C] // Матеріали 17-ї міжнародної конференції ACM SIGSPATIAL про досягнення в геоінформаційних системах. 2009: 352-361.

FMM досить схожий на цей, за винятком того, що використовується попередня обчислення.

  • У документі FMM згадується покарання за уникнення зворотного руху. Це все ще реалізоване?

Ні, це було вилучено з поточної реалізації, оскільки рідко використовується.

Я не думаю, що FMM та STMATCH дотримуються одного принципу, але один використовує попередні обчислення, а інший ні.

Він безпосередньо візуалізується в QGIS без зовнішнього плагіна. Ви просто визначаєте символ спрямованої лінії.

Я б порадив спочатку поглянути на мережу в QGIS. Якась його частина може бути не підключена.

Cweber9843 прокоментував 14 травня 2020 р

Дякуємо за швидку відповідь!
Я щойно зрозумів, що моя проблема дійсно може походити з мережі: щоб отримати спрямовані посилання, я продублював вихідні координати та обмінявся джерелом / ціллю, але фактично не змінюючи лінію. Я думаю, для справжньої спрямованої мережі мені доведеться повернути геометрію. Дякую, що підштовхнули мене у правильному напрямку!

Cweber9843 прокоментував 14 травня 2020 р

Ще раз дякую за ваші коментарі, проблема справді була в мережі. Зараз я змінив кожну геометрію, і тепер мережа справді є двонаправленою, не тільки маючи пари джерела-цілі, поміняні місцями з однаковим напрямком у геометрії.

Тепер STMATCH надійно знаходить хороші збіги, мало зворотних рухів, і в моєму тестовому зразку я бачу лише одне хибнопозитивне збіг. Алгоритм також менш чутливий до параметрів.
Тепер я можу перейти до більш реалістичних треків і провести там більше тестування.

Cweber9843 прокоментував 15 травня 2020 р

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

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

Чи є у вас підказки, чому я не отримую cpath?
Я (ще) не створив свій шейп-файл так, як ви описали, через postGIS, а скоріше через geopandas та networkX.

Cyang-kth прокоментував 15 травня 2020 р

Причиною того, що у вас є опат, але порожній шлях, є дві відповідні точки, які не підключені до мережі.

Якщо ви можете насправді витягти цю одиночну траєкторію в окремий файл traj.csv, а потім запустити з рівнем журналу 0, тоді ви зможете побачити більш детальний журнал процесу зіставлення карт, який може надрукувати, що деякі точки не пов'язані.

Файл журналу може містити сотні тисяч рядків, спочатку ви можете експортувати його у файл журналу, а потім перевірити цей журнал

Cweber9843 прокоментував 19 травня 2020 р

@ cyang-kth, ще раз дякую за швидку відповідь.

Тепер я запустив stmatch із командного рядка, у мережі WGS84 та даних (UTM32 видав помилку SQLite, не маючи такого стовпця: publication_date - ви хочете про це повідомити про помилку? API python працює незалежно від CRS.).

Однак я не бачу більше інформації про те, які точки не пов’язані:
Зміст stmatch.log:
[info] [stmatch_app_config.cpp: 48] Почніть читати конфігурацію stmatch з аргументів [info] [stmatch_app_config.cpp: 105] Завершіть читанням конфігурації arg stmatch [info] [stmatch_app_config.cpp: 109] ---- Конфігурація друку - - [info] [network_config.cpp: 6] NetworkConfig [info] [network_config.cpp: 7] Ім'я файлу: ./data/bike_centerline_v1_extract_ANVedges_source_target_rev_renamed_mini_WGS84.shp [info] [id_config.cpp] [id]: info_config.cpp [network_config.cpp: 9] Назва джерела: джерело [info] [network_config.cpp: 10] Назва цілі: ціль [info] [gps_config.cpp: 19] Формат GPS: точка CSV [інформація] [gps_config.cpp: 20] Ім'я файлу: ./data/syntetic_data_ANV_WGS84.csv [info] [gps_config.cpp: 21] Ім'я ідентифікатора: id [info] [gps_config.cpp: 22] x name: x [info] [gps_config.cpp: 23] y name : y [info] [gps_config.cpp: 24] Назва мітки часу: timestamp [info] [result_config.cpp: 30] ResultConfig [info] [result_config.cpp: 31] Файл: mr.txt [info] [result_config.cpp: 32] Поля: opath cpath mgeom [інформація] [stmatch_algorithm.c pp: 22] STMATCHAlgorithmConfig [info] [stmatch_algorithm.cpp: 23] k 4 радіус 0,4 gps_error 0,5 vmax 80 фактор 1,5 [info] [stmatch_app_config.cpp: 114] Рівень журналу 0-трасування [info] [stmatch_app_config.cpp: 115] Крок 1 [info] [stmatch_app_config.cpp: 116] Використовуйте omp false [info] [stmatch_app_config.cpp: 117] ---- Конфігурація друку виконана ---- [попередження] [result_config.cpp: 167] Замінити існуючий файл результатів mr.txt [info] [network.cpp: 37] Зчитування мережі з файлу ./data/bike_centerline_v1_extract_ANVedges_source_target_rev_renamed_mini_WGS84.shp [info] [network.cpp: 130] Кількість ребер 60 вузлів 28 [info] [network.cpp: 131] Індекс поля: ідентифікатор 2 джерело 4 ціль 5 [info] [network.cpp: 134] Читання мережі виконано. [info] [network_graph.cpp: 17] Побудувати графік з початку країв мережі [info] [network_graph.cpp: 30] Вузли графіків 28 країв 60 [info] [network_graph.cpp: 31] Побудувати графік з кінця країв мережі [info] [gps_reader.cpp: 239] Ідентифікатор ідентифікатора 0 x індекс 1 y індекс 2 часовий індекс 3 [info] [stmatch_app.cpp: 33] Крок звіту про хід 1 [info] [stmatch_app.cpp: 35] Почати збігатись з траєкторіями [info] [stmatch_app.cpp: 64] Запуск відповідності карти в одному потоці [info] [stmatch_app.cpp: 67] Прогрес 0 [info] [stmatch_app.cpp: 81] Процес MM завершено [info] [stmatch_app.cpp: 87] Час займає 0,002 [info] [stmatch_app.cpp: 88] Час займає без урахування вводу 0 [info] [stmatch_app.cpp: 89] Завершити збіг на карті загальна кількість балів 26 збіглись 0 [info] [stmatch_app.cpp: 91] Відповідний відсоток: 0 [info ] [stmatch_app.cpp: 92] Швидкість збігу точок: 0 [інформація] [stmatch_app.cpp: 93] Швидкість збігу точок (без урахування вводу): -nan [info] [stmatch_app.cpp: 95] Час займає 0,002
І mr.txt:
idopathcpathmgeom 12312150,12149,10902,10902,10902,10902,10902,11310,11309,11309,10122,10122,10122,10122,9381,9381,9381,9009,9764,9009,9009,9009,9009,9009,9009 , 9009LINESTRING ()

Я цілком впевнений, що моя мережа зараз підключена та двонаправлена:

Цифри зеленого та червоного - це вихідний та цільовий вузол відповідно, а цифри чорного - це ідентифікатор краю. Усі ребра є двонаправленими, і всі вони, здається, з'єднані (наприклад, вузол 126 є джерелом для ребра 154, але є цільовим для 362). Я перевірив це для всіх країв у цьому прикладі.
bike_centerline_v1_extract_ANVedges_source_target_rev_renamed_mini_WGS84.shp


Рецепт автоматичного переходу від даних до тексту до слайдів Reveal.js

Протягом останніх кількох років я експериментував з різними рецептами для створення текстових звітів із табличних наборів даних (плагіни електронних таблиць також починають з’являтися з подібною метою). З цим пов’язано кілька питань, серед яких:

  • визначення, які дані або статистичні дані ви хочете повідомити зі свого набору даних
  • (автоматичне отримання статистичних даних)
  • побудова відповідних речень з даних
  • упорядкування речень у якусь структуру розповіді
  • змушуючи речення добре читатись разом.

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

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

У попередніх кількох дописах спостерігач серед вас, можливо, помічав, що я & # 8217 досліджував пару компонентів рецепта, який можна використовувати для створення презентацій на основі браузера reve.js із 20%, на які припадає 80%.

Набір даних, з яким я возився, - це набір щомісячних даних про витрати на прозорість від Ради острова Уайт. Останні випуски мають вигляд:

Отож, як натякалося раніше, можна використовувати такий процес для автоматичного створення слайд-шоу show.js із блокнота Jupyter з відповідним чином сконфігурованими комірками слайдів (насправді, звичайними комірками з відповідним набором елементів метаданих), що використовуються як проміжне представлення .

Тут є приклад слайд-шоу на основі даних за жовтень 2016 р. Зверніть увагу, що деякі слайди мають & # 8220підслізки & # 8221, тобто слайди внизу їх, тому спостерігайте за стрілочними індикаторами внизу ліворуч, щоб відстежувати, коли вони будуть доступні. Також зауважте, що прокрутка трохи вдарена і пропущена - в ідеалі новий слайд завжди буде прокручуватися доверху, а для фрагментів, вставлених у слайд, по одному слайд повинен прокручувати вниз, щоб слідувати за ними).

Структура презентації загалом така:

Наприклад, тут & # 8217s зведений слайд витрат за дирекцією & # 8211 зауважте, що ми можемо вставляти діаграми досить легко. (Діаграми стилізовані з використанням морський народжений, тому цілий ряд альтернативних тем є тривіально доступними). Окремі пункти дирекції подаються по одному за раз фрагменти.

Наступний слайд оглядає витрати капіталу та витрат доходів для певної дирекції з розбивкою за вид витрат (відповідні слайди створюються для всіх інших дирекцій). (Я також зробив розбивку для кожної дирекції за зона обслуговування.)

Перелічені предмети впорядковані за вартістю і разом приймають принаймні 80% витрат у відповідній області. Будь-які додаткові статті, що становлять більше 5% (?) Відповідних витрат, також перераховані.

Зверніть увагу на те, що доступні слайди вниз з цього слайда, а не поперек мережа ковзає в палубі. Ця 1,5D-структура означає, що ми можемо вкласти в презентацію елемент гнучкого дизайну розповіді, що дає читачеві можливість досліджувати дані, але обмежено.

У цьому випадку я сформулював слайди для кожного основного виду витрат, що вноситься до фондів капіталу та доходів, а потім додав розбивку основних постачальників для цієї сфери витрат.

Це просто являє собою перший прохід при генерації 1,5D колоди слайдів з табличного набору даних. Евристика Парето (80/20) використовується для того, щоб спробувати визначити пріоритет щодо інформації, що відображається, щоб скласти 80% витрат у різних областях або інші значні внески.

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

Наступним кроком є ​​розгляд інших способів сегментування та структурування даних, щоб скласти звіти, які могли б бути справді корисними & # 8230

Якщо у вас є якісь ідеї, будь ласка, повідомте мені про це за допомогою коментарів або зв’яжіться безпосередньо & # 8230

PS FWIW, це повинно бути досить легко, щоб запустити будь-який інший набір даних, який виглядає в цілому як приклад зверху, через той самий код, лише з декількома незначними налаштуваннями & # 8230


Анімована візуалізація польоту

Поки що ми розглянули лише статичну безжиттєву графіку з кількома перекладами для отримання додаткової інформації. Давайте зробимо анімаційну візуалізацію, яка показує активні польоти з часом між Мельбурном та Сіднеєм в Австралії.

Документ SVG для цього типу графіки складається з тексту, рядків та кіл.

Динамічними частинами є час та елементи всередині політ group і дані можуть виглядати приблизно так:

Щоб отримати позицію x на динамічний час, нам потрібно буде створити шкалу часу для кожного рейсу, яка відображає час вильоту та прибуття до позиції x на нашій карті. Ми можемо переглядати наші дані на початку, додаючи об’єкти та масштаби Date, щоб з ними було простіше працювати. Moment.js тут дуже допомагає при аналізі дат та маніпуляціях.

Тепер ми можемо передати нашу дату зміни в xScale (), щоб отримати координату x для кожного польоту.

Візуалізація петлі

Час відправлення та прибуття округлюється до 5 хвилин, тому ми можемо крокувати через наші дані з кроком 5 м від першого вильоту до останнього прибуття.

Вхід, оновлення та вихід

D3 дозволяє вказувати перетворення та переходи елементів, коли:

  • Приходять нові точки даних (Enter)
  • Змінення існуючих точок даних (оновлення)
  • Існуючі точки даних видаляються (вихід)

Переходи

Наведений вище код відображає кадр кожні 500 мс з 5-хвилинним приростом часу:

  • Він оновлює час
  • Створює нову групу польотів з колом для кожного польоту
  • Оновлення координат x / y поточних рейсів
  • Видаляє групи польотів, коли вони прибули

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

Наприклад, давайте зменшуватимемо прозорість входу до польотних груп.

Давайте зникатиме вихідних польотних груп.

Додайте плавний перехід між точками x та y.

Ми також можемо перекласти час між кроками в 5 хвилин, щоб він відображав кожну хвилину, а не кожні п’ять хвилин, використовуючи функцію tween.


Перегляньте відео: C# Geometrik Cisimler Çizme DrawRectangle - DrawEllipse