Բովանդակություն:

Ինչպես ստեղծել OpenStreetMap- ի միջոցով հարմարեցված ոճավորված քարտեզներ. 7 քայլ (նկարներով)
Ինչպես ստեղծել OpenStreetMap- ի միջոցով հարմարեցված ոճավորված քարտեզներ. 7 քայլ (նկարներով)

Video: Ինչպես ստեղծել OpenStreetMap- ի միջոցով հարմարեցված ոճավորված քարտեզներ. 7 քայլ (նկարներով)

Video: Ինչպես ստեղծել OpenStreetMap- ի միջոցով հարմարեցված ոճավորված քարտեզներ. 7 քայլ (նկարներով)
Video: 8 բան, որ տղամարդիկ անում են ՄԻԱՅՆ այն կնոջ հետ, ում սիրում են 2024, Հուլիսի
Anonim
Ինչպես ստեղծել Open StreetMap- ի միջոցով հարմարեցված ոճավորված քարտեզներ
Ինչպես ստեղծել Open StreetMap- ի միջոցով հարմարեցված ոճավորված քարտեզներ

Այս ուսանելի դասում ես նկարագրելու եմ մի գործընթաց, որի միջոցով դուք կարող եք ստեղծել ձեր սեփական պատվերով պատրաստված ոճավորված քարտեզները: Ոճավորված քարտեզը այն քարտեզն է, որտեղ օգտագործողը կարող է նշել, թե տվյալների որ շերտերն են պատկերված, ինչպես նաև սահմանել այն ոճը, որով յուրաքանչյուր շերտը պատկերված է: Սկզբում ես կներկայացնեմ այն գործընթացը, որի միջոցով կարող եք ծրագրաշար գրել քարտեզները ոճավորելու համար, որին հաջորդելու է Python ծրագրաշարի օրինակը, որը ես գրել եմ այս առաջադրանքը կատարելու համար:

Հետևյալ տեսանյութը ցույց է տալիս, թե ինչպես եմ ես անձամբ ձևավորում ոճավորված քարտեզներ, բայց շարունակում եմ կարդալ ինտիմ մանրամասների համար: Ես շատ ոգևորված եմ տեսնել, թե ինչ է ստեղծում համայնքը:

Ո՞րն է իմ մոտիվացիան այս նախագծի հետևում:

Անկեղծ ասած, ես սկսեցի այս նախագիծը, քանի որ կարծում էի, որ դա հաճելի կլինի անել: Այս միտքը պտտվում էր իմ մտքում վերջին մեկ տարվա ընթացքում, և ես վերջապես վերցրեցի այն ժամանակը, որն անհրաժեշտ էր այն կյանքի կոչելու համար: Հիմնական սցենարների նախատիպերից հետո ես կարողացա չափազանց խոստումնալից արդյունքներ տալ, այնքան խոստումնալից, որ գիտեի, որ պետք է ձևակերպեմ իմ սցենարները այնպես, որ մյուսները հեշտությամբ կարողանան ինքնուրույն ստեղծագործություններ կատարել:

Այս հրահանգը գրելու իմ մոտիվացիան պայմանավորված է նրանով, որ ես գտա շատ նվազագույն տեղեկատվություն այն մասին, թե ինչպես ստեղծել ձեր սեփական ոճավորված քարտեզները զրոյից: Հուսով եմ, որ իմ սովորածը կկիսեմ համայնքի հետ:

Ռեսուրսներ/հղումներ

  • OpenStreetMap
  • OpenStreetMap Legalese
  • Github շտեմարան

Պարագաներ

  • Python բաշխում (ես օգտագործել եմ Anaconda և Python 3.6)
  • PyQt5 (GUI- ի կախվածության համար)

Քայլ 1. Գործընթացը սահմանելը. Ներբեռնել OSM ֆայլը

Գործընթաց I սահմանելը. OSM ֆայլի ներբեռնում
Գործընթաց I սահմանելը. OSM ֆայլի ներբեռնում

Երբ ես առաջին անգամ սկսեցի այս նախագիծը, ամենացայտուն հարցն էր ՝ «որտեղի՞ց կարող եմ քարտեզի տվյալներ ստանալ»: Բնականաբար, ինչպես և կսպասեիք, ես անմիջապես մտածեցի Google Քարտեզների մասին: Significantգալի հետազոտություններից հետո ես պարզեցի, որ Google- ն իսկապես չի ցանկանում, որ մարդիկ խաղան իրենց տվյալների հետ ՝ ստեղծագործական իմաստով կամ այլ կերպ: Փաստորեն, նրանք բացահայտորեն արգելում են Google Քարտեզներից վեբ գրառումները:

Բարեբախտաբար, իմ հուսահատությունը կարճ տևեց, երբ հայտնաբերեցի OpenStreetMap (OSM): OSM- ը համատեղ ծրագիր է, որը ներառում է աշխարհի տարբեր ծայրերում գտնվող մարդկանց տվյալները: OSM- ը հստակորեն թույլ է տալիս իրենց տվյալների բաց օգտագործումը բաց կոդով ծրագրակազմի անունով: Որպես այդպիսին, OSM- ի վեբ էջ այցելելը հենց այնտեղ է սկսվում քարտեզի ոճավորման ճանապարհորդությունը:

OSM- ի կայք ժամանելուց հետո կտտացրեք «Արտահանել» ներդիրին ՝ քարտեզի արտահանման գործիքները ցուցադրելու համար: Այժմ, մեծացրեք ՝ դիտելու այն տարածաշրջանը, որով հետաքրքրված եք քարտեզի տվյալների հավաքագրմամբ: Ընտրեք «Ձեռքով ընտրեք այլ տարածք» հղումը, որը ձեր էկրանին կհայտնվի տուփ: Ձևավորեք և տեղադրեք այս տուփը հետաքրքրության տարածաշրջանի վրա: Բավարարվելուց հետո կտտացրեք «Արտահանել» կոճակին ՝ ձեր OSM տվյալների ֆայլը ներբեռնելու համար:

Նշում #1. Եթե ձեր ընտրած շրջանը պարունակում է չափազանց շատ տվյալներ, դուք կստանաք սխալ, որ դուք ընտրել եք շատ հանգույցներ: Եթե դա ձեզ հետ պատահի, կտտացրեք «Overpass API» կոճակին ՝ ձեր ավելի մեծ ֆայլը ներբեռնելու համար:

Նշում #2. Եթե ձեր ներբեռնված OSM ֆայլը 30 ՄԲ -ից մեծ է, իմ գրած Python ծրագիրը նկատելիորեն կդանդաղի: Եթե դուք վճռական եք օգտագործել մեծ տարածաշրջան, մտածեք սցենար գրել ավելորդ տվյալները դեն նետելու համար, որոնք դուք չեք պատրաստվում նկարել:

Քայլ 2. Գործընթացը սահմանելը. Տվյալների իմացություն

Գործընթացի սահմանում. Տվյալների ըմբռնում
Գործընթացի սահմանում. Տվյալների ըմբռնում
Գործընթացի սահմանում. Տվյալների ըմբռնում
Գործընթացի սահմանում. Տվյալների ըմբռնում
Գործընթացի սահմանում. Տվյալների ըմբռնում
Գործընթացի սահմանում. Տվյալների ըմբռնում
Գործընթացի սահմանում. Տվյալների ըմբռնում
Գործընթացի սահմանում. Տվյալների ըմբռնում

«Տվյալներ ունեմ … հիմա ի՞նչ»:

Սկսեք ձեր ներբեռնված OSM ֆայլը բացելով ձեր նախընտրած տեքստի խմբագրման ծրագրաշարի մեջ: Նախևառաջ կնկատեք, որ սա XML ֆայլ է, ինչը հիանալի է: XML- ը բավականին հեշտ է վերլուծել: Ձեր ֆայլի սկիզբը պետք է համարյա նույնական լինի այս քայլի առաջին նկարի հետ. Կցուցադրվեն որոշ հիմնական մետատվյալներ և աշխարհագրական սահմաններ:

Ֆայլը ոլորելիս կնկատեք տվյալների երեք տարր, որոնք օգտագործվում են ամբողջ ընթացքում.

  1. Հանգույցներ
  2. Եղանակներ
  3. Հարաբերություններ

Տվյալների ամենահիմնական տարրը, հանգույցը պարզապես ունի դրա հետ կապված եզակի նույնացուցիչ, լայնություն և երկայնություն: Իհարկե, կան լրացուցիչ մետատվյալներ, բայց մենք կարող ենք ապահով կերպով հրաժարվել դրանից:

Wանապարհները հանգույցների հավաքածու են: Wayանապարհը կարող է ներկայացվել որպես փակ ձև կամ բաց եզրագիծ: Wանապարհները բաղկացած են հանգույցների հավաքածուից, որոնք նույնականացվում են իրենց եզակի նույնացուցիչով: Դրանք պիտակավորված են բանալիներով, որոնք սահմանում են այն տվյալների խումբը, որին նրանք պատկանում են: Օրինակ, վերը նշված երրորդ պատկերում պատկերված ձևը պատկանում է տվյալների խմբին ՝ «տեղ», և նրա ենթախմբին ՝ «կղզի»: Այլ կերպ ասած, այս կոնկրետ ճանապարհը պատկանում է «տեղ» խմբի տակ գտնվող «կղզի» շերտին: Ուղիներն ունեն նաև յուրահատուկ նույնացուցիչներ:

Ի վերջո, հարաբերությունները ուղիների հավաքածու են: Հարաբերությունը կարող է ներկայացնել բարդ ձև ՝ անցքերով կամ բազմաթիվ շրջաններով: Հարաբերությունները կունենան նաև եզակի նույնացուցիչ և կպիտակավորվեն եղանակների նման:

Այս տվյալների տարրերի մասին ավելին կարող եք կարդալ OSM վիքիից:

  • Հանգույցներ
  • Եղանակներ
  • Հարաբերություններ

Քայլ 3. III գործընթացի սահմանում. Տվյալների մարսում

III գործընթացի սահմանում. Տվյալների մարսում
III գործընթացի սահմանում. Տվյալների մարսում

Այժմ դուք պետք է առնվազն մակերեսային պատկերացում ունենաք OSM ֆայլ կազմող տվյալների տարրերի մասին: Այս պահին մենք շահագրգռված ենք կարդալ OSM- ի տվյալները `օգտագործելով ձեր նախընտրած լեզուն: Թեև այս քայլը Python- ի վրա հիմնված է, եթե չեք ցանկանում օգտագործել Python- ը, դեռ պետք է կարդաք այս մասը, քանի որ այն պարունակում է մի քանի խորհուրդ և հնարք:

Xml փաթեթը լռելյայն ներառված է Python- ի ստանդարտ բաշխումների մեծ մասի հետ: Մենք կօգտագործենք այս փաթեթը ՝ շատ հեշտությամբ վերլուծելու մեր OSM ֆայլը, ինչպես ցույց է տրված առաջին նկարում: Loop for single- ում կարող եք մշակել OSM տվյալների մշակումը տվյալների յուրաքանչյուր առանձին տարրի համար:

Պատկերի վերջին տողում դուք կնկատեք, որ ես ստուգում եմ «սահմաններ» պիտակը: Այս քայլը կենսականորեն կարևոր է լայնության և երկայնության արժեքները էկրանին պիքսելների թարգմանելու համար: Ես խորհուրդ եմ տալիս այս փոխարկումը գործարկել OSM ֆայլը բեռնելիս, քանի որ տվյալների զանգվածային փոխակերպումը ինտենսիվ գործընթաց է:

Խոսելով լայնություններ և երկայնություններ էկրանի կոորդինատների վերածելու մասին, ահա իմ գրած հաշվարկային գործառույթի հղումը: Դուք, ամենայն հավանականությամբ, մի փոքր տարօրինակ բան կնկատեք ՝ լայնությունը էկրանի կոորդինատներ փոխարկելու ժամանակ: Երկայնության հետ համեմատած կա լրացուցիչ քայլ: Ինչպես պարզվում է, OSM- ի տվյալները մոդելավորվում են Pseudo-Mercator պրոյեկցիոն մեթոդով: Բարեբախտաբար, 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 repo- ն ներկայացված է ներածության մեջ):

Իմ կոնկրետ իրականացումը կենտրոնանում է մատուցման խողովակաշարի օգտագործողի վերահսկողության վրա: Մասնավորապես, ես թույլ եմ տալիս օգտվողին ընտրել այն շերտերը, որոնք նրանք ցանկանում են տեսանելի լինել և ինչպես են նրանք ցանկանում, որ այդ շերտը տեսանելի լինի: Ինչպես համառոտ նշեցի ավելի վաղ, մատուցվող տարրերի երկու դաս կա. Լրացնել տարրերը և տողերը: Լրացումները սահմանվում են միայն գույնով, իսկ տողերը `գույնով, գծի լայնությամբ, գծի ոճով, գծի գլխարկի ոճով և գծին միանալու ոճով:

Քանի որ օգտվողը փոփոխություններ է կատարում շերտերի ոճերի և տեսանելիության մեջ, փոփոխությունները արտացոլվում են աջ կողմում գտնվող քարտեզի վիջեթում: Երբ օգտվողը փոխում է քարտեզի արտաքին տեսքը `ըստ իր գոհունակության, նա կարող է հարմարեցնել քարտեզի առավելագույն չափը և քարտեզը պահել որպես պատկեր իր համակարգչում: Պատկերը պահելու դեպքում օգտագործողի կազմաձևման ֆայլը նույնպես կպահվի: Սա ապահովում է, որ օգտագործողը կարողանա ցանկացած պահի հետ կանչել և նորից օգտագործել այն կոնֆիգուրացիան, որն օգտագործել է որոշակի պատկեր ստեղծելու համար:

Քայլ 5. Իրականացման թերություն + լուծում

Իրականացման թերություն + լուծում
Իրականացման թերություն + լուծում
Իրականացման թերություն + լուծում
Իրականացման թերություն + լուծում

Երբ ես առաջին անգամ սկսեցի ձեռքով ոճավորել քարտեզը, ես իմացա, որ սա բավականին հոգնեցուցիչ գործընթաց էր: Օգտվողին առավելագույն վերահսկողություն առաջարկելը կարող է պարզապես ճնշող լինել `հասանելի« կոճակների »մեծ քանակի պատճառով: Այնուամենայնիվ, կա մի պարզ լուծում, որը ենթադրում է մի փոքր լրացուցիչ սցենարագրում:

Ես սկսեցի ՝ պարզելով, թե որ շերտերն են ինձ հատկապես հետաքրքրում: Այս ուսանելի, նպատակների համար, ենթադրենք, ինձ ամենաշատը հետաքրքրում են շենքերը (բոլորը), գետերը, հիմնական մայրուղիները և մակերեսային փողոցները: Ես կգրեի մի սցենար, որտեղ ես ստեղծում եմ կազմաձևման օրինակ, շեղում եմ շերտերի վիճակները համապատասխանաբար ՝ օգտագործելով setItemState () գործառույթը և սահմանված հաստատունները, և գույներ սահմանում ՝ հիմնվելով այն բանի վրա, թե ինչպես կցանկանայի, որ իմ շերտերը հայտնվեին setValue () - ի միջոցով: Ստացված կազմաձևման ֆայլը, որը պահվում է, կարող է պատճենվել կազմաձևերի թղթապանակում և բեռնվել օգտվողի կողմից:

Օրինակ սցենարը վերևի պատկերում է: Երկրորդ պատկերը նմուշ է, թե ինչպիսին կլինեին օգնականի գործառույթները, և քանի որ դրանք հիմնականում բոլորը նույնական են, պարզապես տարբեր հաստատուններով, ես ներառեցի միայն մեկ օրինակի նկար:

Քայլ 6. Բարելավման ոլորտներ

Բարելավման ոլորտներ
Բարելավման ոլորտներ

Իմ ծրագրային ապահովման իրագործմանն անդրադառնալուց հետո ես առանձնացրել եմ մի քանի ոլորտներ, որոնք օգտակար բարելավումներ կլինեն էներգիայի օգտագործողների համար:

  1. Շերտերի դինամիկ մատուցում: Ներկայումս ես ունեմ շերտերի կանխորոշված ցուցակ, որոնք մատուցվելու են, վերջ: Հիմնավորման մի մասը դժվարությունն էր `որոշելու, թե արդյոք շերտը պետք է լինի գիծ կամ լրացում: Արդյունքում, գրեթե յուրաքանչյուր OSM ֆայլ, որը բացում եք, ձեզ կդիմավորեն մի շարք նախազգուշացումներով շերտերի մասին, որոնք չեն մատուցվի: Հաճախ դրանք այնքան նվազագույն են, որ դա խնդիր չէ, բայց, հավանաբար, բացակայում են կրիտիկական շերտերը: Շերտերի դինամիկ մատուցումը կվերացնի այդ մտահոգությունները:
  2. Դինամիկ շերտի նշանակում: Սա գնում է ձեռք ձեռքի տված #1; եթե ցանկանում եք դինամիկ շերտի մատուցում, ձեզ հարկավոր է դինամիկ շերտի նշանակում (այսինքն ՝ լրացման շերտի նույնացում ընդդեմ գծի շերտի): Սա, ինչպես ես եմ սովորել, ողջամիտ կերպով կարող էր իրականացվել, քանի որ այն ուղիները, որոնց առաջին և վերջին հանգույցը նույնն են, փակ ճանապարհներ կլինեն և, հետևաբար, կլցվեն:
  3. Գունավոր խմբեր: Ոճավորված քարտեզը հաճախ ունի մի քանի շերտեր, որոնք ունեն նույն ոճը, և օգտվողին հնարավորություն տալը միաժամանակ փոփոխել խմբի ոճը, զգալիորեն կնվազեցնի օգտագործողների ծախսած ժամանակը մեկ առ մեկ:

Քայլ 7: Մտքերի փակումը

Փակման մտքեր
Փակման մտքեր
Փակման մտքեր
Փակման մտքեր
Փակման մտքեր
Փակման մտքեր

Շնորհակալ եմ բոլորին ժամանակ տրամադրելու համար ՝ կարդալու իմ Instructable- ը: Այս նախագիծը ներկայացնում է բազմաթիվ ժամերի հետազոտությունների, նախագծման, ծրագրավորման և կարգաբերման գագաթնակետը: Հուսով եմ, որ ես կարողացել եմ տրամադրել մեկնարկի հարթակ, որից դուք կարող եք կառուցել ձեր սեփական նախագիծը կամ կառուցել այն, ինչ արդեն գրել եմ: Նաև հույս ունեմ, որ իմ թերություններն ու խորհուրդները բազմաթիվ կետեր են տալիս, որոնք պետք է հաշվի առնել ձեր նախագծում: Եթե դուք ավելի քիչ եք հակված ծրագրավորման և ավելի շատ հակված եք արվեստի գործեր ստեղծելու, ես կցանկանայի տեսնել, թե ինչ եք պատրաստում մեկնաբանություններում: Հնարավորություններն անսպառ են:

Հատուկ շնորհակալություն OpenStreetMap- ի ներդրողներին: Նման նախագծերը հնարավոր չէին իրականացնել առանց նրանց զգալի ջանքերի:

Խնդրում եմ ինձ տեղյակ պահեք, եթե մեկնաբանության մեջ հարցեր ունեք:

Քարտեզների մարտահրավեր
Քարտեզների մարտահրավեր
Քարտեզների մարտահրավեր
Քարտեզների մարտահրավեր

Երկրորդ տեղը գրավեց Քարտեզների մարտահրավերը

Խորհուրդ ենք տալիս: