Съдържание:

Как да създадете персонализирани стилизирани карти с помощта на OpenStreetMap: 7 стъпки (със снимки)
Как да създадете персонализирани стилизирани карти с помощта на OpenStreetMap: 7 стъпки (със снимки)

Видео: Как да създадете персонализирани стилизирани карти с помощта на OpenStreetMap: 7 стъпки (със снимки)

Видео: Как да създадете персонализирани стилизирани карти с помощта на OpenStreetMap: 7 стъпки (със снимки)
Видео: CS50 2015 - Week 9, continued 2024, Юли
Anonim
Как да създадете персонализирани стилизирани карти с помощта на OpenStreetMap
Как да създадете персонализирани стилизирани карти с помощта на OpenStreetMap

В тази инструкция ще опиша процес, чрез който можете да генерирате свои собствени персонализирани стилизирани карти. Стилизираната карта е карта, където потребителят може да определи кои слоеве от данни се визуализират, както и да определи стила, с който всеки слой се визуализира. Първо ще опиша процеса, чрез който можете да пишете софтуер за стилизиране на карти, последван от пример за софтуера Python, който написах, за да изпълня тази задача.

Следващото видео подчертава как аз лично генерирам стилизирани карти, но продължавам да чета за интимните подробности. Много съм развълнуван да видя какво създава общността!

Каква е моята мотивация зад този проект?

Честно казано, започнах този проект, защото мислех, че ще бъде забавно да го направя. Тази идея се върти в съзнанието ми през последната година и най -накрая отделих необходимото време, за да я осъществя. След един ден на прототипиране с някои основни скриптове, успях да генерирам изключително обещаващи резултати - толкова обещаващи, че знаех, че трябва да формализирам моите скриптове, така че другите лесно да могат да създават свои собствени творения.

Мотивацията ми да напиша тази инструкция се дължи на факта, че открих много минимална информация за това как да създадете свои собствени стилизирани карти от нулата. Надявам се да споделя това, което научих с общността.

Ресурси/Връзки:

  • OpenStreetMap
  • OpenStreetMap Legalese
  • Github хранилище

Консумативи

  • Разпределение на Python (използвах Anaconda & Python 3.6)
  • PyQt5 (за GUI зависимости)

Стъпка 1: Определяне на процеса I: Изтегляне на OSM файла

Определяне на процеса I: Изтегляне на OSM файла
Определяне на процеса I: Изтегляне на OSM файла

Когато за първи път започнах този проект, най -яркият въпрос беше „откъде мога да получа данни от картата“. Естествено, както бихте очаквали, веднага се сетих за Google Maps. След значителни изследвания открих, че Google наистина не иска хората да си играят с техните данни, в творчески смисъл или по друг начин. Всъщност те изрично забраняват изстъргването на уеб от Google Maps.

За щастие, отчаянието ми беше краткотрайно след откриването ми на OpenStreetMap (OSM). OSM е съвместен проект, включващ хора от цял свят, които предоставят данни. OSM изрично разрешава безсрочно използване на техните данни в името на софтуера с отворен код. По този начин посещението на уеб страницата на OSM започва мястото, където картата стилизира пътуването.

След като пристигнете на уебсайта на OSM, щракнете върху раздела „Експорт“, за да покажете инструментите за експортиране на картата. Сега увеличете мащаба, за да видите региона, в който се интересувате от събирането на картографски данни. Изберете връзката „Ръчно изберете друга област“, която ще покаже поле на екрана ви. Оформете и поставете това поле над региона на интерес. След като сте доволни, щракнете върху бутона „Експортиране“, за да изтеглите вашия OSM файл с данни.

Забележка #1: Ако избраният от вас регион съдържа твърде много данни, ще получите грешка, че сте избрали твърде много възли. Ако това се случи с вас, щракнете върху бутона „Overpass API“, за да изтеглите по -големия си файл.

Забележка #2: Ако изтегленият от вас OSM файл е по -голям от 30 MB, програмата Python, която написах, ще се забави значително. Ако сте решени да използвате голям регион, помислете за писане на скрипт, за да изхвърлите излишни данни, които не планирате да рисувате.

Стъпка 2: Определяне на процеса II: Разбиране на данните

Определяне на процеса II: Разбиране на данните
Определяне на процеса II: Разбиране на данните
Определяне на процеса II: Разбиране на данните
Определяне на процеса II: Разбиране на данните
Определяне на процеса II: Разбиране на данните
Определяне на процеса II: Разбиране на данните
Определяне на процеса II: Разбиране на данните
Определяне на процеса II: Разбиране на данните

"Имам данните … сега какво?"

Започнете, като отворите изтегления OSM файл в любимия си софтуер за редактиране на текст. Първо ще забележите, че това е XML файл, което е страхотно! XML е достатъчно лесен за синтактичен анализ. Началото на вашия файл трябва да изглежда почти идентично с първата снимка на тази стъпка - ще бъдат изброени някои основни метаданни и географски граници.

Докато превъртате файла, ще забележите три елемента от данни, използвани навсякъде:

  1. Възли
  2. Начини
  3. Връзки

Най -основният елемент от данни, възел, просто има уникален идентификатор, географска ширина и дължина, свързани с него. Разбира се, има допълнителни метаданни, но можем спокойно да ги изхвърлим.

Начините са колекции от възли. Един начин може да бъде изобразен като затворена форма или като отворена линия. Начините се състоят от колекция от възли, идентифицирани с уникалния им идентификатор. Те са маркирани с ключове, които определят групата данни, към която принадлежат. Например начинът, изобразен в третото изображение по -горе, принадлежи към групата данни „място“и подгрупата му „остров“. С други думи, този конкретен начин принадлежи към слоя "остров" в групата "място". Начините също имат уникални идентификатори.

И накрая, отношенията са съвкупност от начини. Връзката може да представлява сложна форма с дупки или с множество области. Връзките също ще имат уникален идентификатор и ще бъдат маркирани подобно на начините.

Можете да прочетете повече за тези елементи от данните в уикито на OSM:

  • Възли
  • Начини
  • Връзки

Стъпка 3: Дефиниране на процеса III: Разграждане на данните

Дефиниране на процес III: Разграждане на данните
Дефиниране на процес III: Разграждане на данните

Сега трябва да имате поне повърхностно разбиране за елементите от данни, които съставят OSM файл. На този етап се интересуваме от четенето на OSM данните, използвайки вашия език по избор. Въпреки че тази стъпка е ориентирана към Python, ако не искате да използвате Python, все пак трябва да прочетете тази част, тъй като тя съдържа няколко съвета и трика.

Пакетът xml е включен по подразбиране с повечето стандартни дистрибуции на Python. Ще използваме този пакет за много лесно анализиране на нашия OSM файл, както е показано на първото изображение. В един цикъл for можете да обработвате обработката на OSM данни за всеки конкретен елемент от данни.

В последния ред на изображението ще забележите, че проверявам за маркера „граници“. Тази стъпка е жизненоважна при превеждането на стойностите на географската ширина и дължина в пиксели на екрана. Горещо препоръчвам да стартирате това преобразуване по време на зареждането на OSM файла, тъй като масовото преобразуване на данни е интензивно в процеса.

Говорейки за преобразуване на географски ширини и дължини в координати на екрана, ето линк към изчислителната функция, която написах. Вероятно ще забележите нещо малко странно при преобразуването на географска ширина в координати на екрана. Има допълнителна стъпка в сравнение с географската дължина! Оказва се, че OSM данните се моделират с помощта на метода на псевдо-меркаторска проекция. За щастие, OSM има фантастична документация по тази тема тук и те предоставят функции за преобразуване на географска ширина за значителен брой езици. Страхотно!

Забележка: В моя код координатата на екрана (0, 0) е горният ляв ъгъл на екрана.

Стъпка 4: Реализация на Python Map Stylizer

Изпълнение на Python Map Stylizer
Изпълнение на Python Map Stylizer
Изпълнение на Python Map Stylizer
Изпълнение на Python Map Stylizer
Изпълнение на Python Map Stylizer
Изпълнение на Python Map Stylizer

До този момент съм обсъждал OSM файла с данни - какво представлява, как да го чета и какво да правя с него. Сега ще обсъдя софтуера, който написах за справяне със стилистичната визуализация на картата (репо GitHub е предоставено във въведението).

Моята конкретна реализация се фокусира върху потребителския контрол на канала за изобразяване. По -конкретно, позволявам на потребителя да избира слоевете, които искат да се виждат, и как иска този слой да бъде визуализиран. Както накратко споменах по -рано, има два вида визуализирани елементи: попълване на елементи и договорени покупки. Запълванията се дефинират само от цвят, докато линиите се определят от цвят, ширина на линията, стил на линия, стил на капачка на линия и стил на съединяване на линии.

Тъй като потребителят прави промени в стиловете на слоя и видимостта, промените се отразяват в приспособлението за карта вдясно. След като потребителят е променил външния вид на картата, за да удовлетвори тяхното желание, той може да регулира максималния размер на картата и да запише картата като изображение на своя компютър. При запазване на изображение ще бъде записан и потребителски конфигурационен файл. Това гарантира, че потребителят може да извика и използва повторно конфигурацията, която е използвал за генериране на определено изображение по всяко време.

Стъпка 5: Недостатък при внедряване + Решение

Недостатък при внедряване + Решение
Недостатък при внедряване + Решение
Недостатък при внедряване + Решение
Недостатък при внедряване + Решение

Когато за пръв път започнах да оформям карта ръчно, научих, че това е доста досаден процес. Предлагането на максимален контрол на потребителя може да бъде просто поразително поради големия брой налични „копчета“. Има обаче просто решение, което включва малко допълнителни скриптове.

Започнах, като идентифицирах кои слоеве ме интересуват особено. За целите на тази инструкция, да речем, че най -много се интересувам от сгради (всички от тях), реки, основни магистрали и повърхностни улици. Бих написал скрипт, в който създавам екземпляр на конфигурация, превключвам състоянията на слоя по подходящ начин, използвайки функцията setItemState () и дефинирани константи, и задавам цветове въз основа на това как бих искал слоевете ми да се показват с помощта на setValue (). Полученият конфигурационен файл, който се запазва, може да се копира в папката configs и да се зареди от потребителя.

Примерен скрипт е на изображението по -горе. Второто изображение е пример за това как биха изглеждали помощните функции и тъй като те по принцип всички са идентични, само с различни константи, включих само снимка на един пример.

Стъпка 6: Области за подобрение

Области за подобряване
Области за подобряване

След като се замислих върху моето внедряване на софтуер, идентифицирах няколко области, които биха били полезни подобрения за енергичните потребители.

  1. Динамично изобразяване на слоеве. В момента имам предварително дефиниран списък със слоеве, които ще бъдат рендирани, това е всичко. Част от обосновката беше трудността да се определи дали даден слой трябва да бъде линия или запълване. В резултат на това с почти всеки OSM файл, който отворите, ще бъдете посрещнати с множество предупреждения за слоеве, които няма да бъдат визуализирани. Често те са толкова минимални, че не е проблем, но задължително липсват критични слоеве. Динамичното изобразяване на слоя би премахнало тези опасения.
  2. Присвояване на динамичен слой. Това върви ръка за ръка с #1; ако искате динамично изобразяване на слоеве, имате нужда от присвояване на динамичен слой (т.е. идентифициране на слой за запълване спрямо слой ред). Това може разумно да се постигне, както научих, защото начините, чийто първи и последен възел са еднакви, ще бъдат затворени пътища и следователно запълнени.
  3. Цветови групи. Стилизирана карта често има няколко слоя, които имат един и същ стил, и даването на възможност на потребителя да променя стила на групата едновременно значително би намалило времето на потребителя, прекарано в редактиране на слоеве един по един.

Стъпка 7: Затваряне на мисли

Заключващи мисли
Заключващи мисли
Заключващи мисли
Заключващи мисли
Заключващи мисли
Заключващи мисли

Благодаря на всички, че отделихте време да прочетете моя Instructable. Този проект представлява кулминацията на много часове изследвания, проектиране, програмиране и отстраняване на грешки. Надявам се, че успях да осигуря стартова площадка, от която можете да изградите свой собствен проект или да надградите това, което вече написах. Надявам се също, че моите недостатъци и съвети предоставят много точки, които да вземете предвид при вашия дизайн. Ако сте по -малко склонни към програмиране и по -склонни да създавате произведения на изкуството, ще се радвам да видя какво правите в коментарите! Възможностите са безкрайни!

Специални благодарности на сътрудниците на OpenStreetMap! Проекти като този не биха били възможни без техните значителни усилия.

Моля, уведомете ме, ако имате въпроси в коментарите!

Предизвикателство на Карти
Предизвикателство на Карти
Предизвикателство на Карти
Предизвикателство на Карти

Вицешампион в предизвикателството на Карти

Препоръчано: