Daha çox

Nominatim PostGIS verilənlər bazası ilə xəritə plitələrini işlətmək mümkündürmü?

Nominatim PostGIS verilənlər bazası ilə xəritə plitələrini işlətmək mümkündürmü?


Nominatim'in setup.php faylını istifadə edərək bir OSM verilənlər bazası idxal etdim. Faylları o verilənlər bazasından istifadə etmək üçün bəzi proqramlardan istifadə etmək mümkündürmü, yoxsa Mapnik və bənzəri üçün fərqli bir verilənlər bazasına yenidən idxal etməliyəm?


Xeyr, verilənlər bazasını təkrar emal etmək mümkün deyil, çünki hər iki alət çox fərqli vəzifələr yerinə yetirir və buna görə də gözəl və hamar işləmək üçün çox spesifik məlumat quruluşları yaradırlar.

Zəhmət olmasa başqa bir dəfə DB zibilliyinizi mapnik üçün idxal edin: www.switch2osm.org


Nominatim PostGIS verilənlər bazası ilə xəritə plitələrini işlətmək mümkündürmü? - Coğrafi İnformasiya Sistemləri

Bu proqram iki əsas hissədən ibarətdir:

  1. mod_tile: Xəritə plitələrini çatdırmaq üçün Apache 2 modulu.
  2. renderd: mapnik istifadə edərək xəritə plitələrini göstərən bir daemon.

Birlikdə, məsələn, sürüşkən bir xəritədə istifadə etmək üçün raster xəritə plitələrini səmərəli şəkildə düzəldirlər və xidmət edirlər. İkisi, OpenStreetMap.org -un klassik raster kafel yığından ibarətdir.

Göstərməyə alternativ olaraq Tirex mod_tile ilə birlikdə istifadə edilə bilər.

Debian və ya Ubuntu sistemlərində tərtib etməyə başlamaq üçün aşağıdakı paketlərə ehtiyac var. Digər sistemlərdə kitabxananın adı bir qədər fərqli ola bilər.

(İşlənmə funksiyasını əlavə etmək üçün daha çox və isteğe bağlı asılılıqlar quraşdıra bilərsiniz)

Asılılıqlar qurulduqdan sonra mod_tile və renderd tərtib edə və quraşdıra bilərsiniz:

Proqramı özünüz tərtib etmək istəmirsinizsə. Üçün əvvəlcədən tərtib edilmiş proqram paketləri DebianUbuntu müvafiq depoda Debian GIS Team tərəfindən saxlanılır. Onlar boru kəmərindədirlər və bu iki paylamanın növbəti buraxılışlarına daxil olacağı gözlənilir.

Bu vaxt /etc/apt/sources.list -ə müvafiq sətir əlavə etməklə eksperimental bir depo istifadə edilə bilər:

deb https://deb.openbuildingmap.org/ bullseye main (Debian Testing, Ubuntu Focal və Ubuntu Groovy üçün) deb https://deb.openbuildingmap.org/ buster main (Debian Stable üçün)

Daha sonra depo üçün açıq açarı idxal edin:

Bundan sonra, mövcud proqramı başqa bir paket kimi quraşdıra bilərsiniz:

Proqramı özünüz kopyaladıqdan və ya proqram paketlərini quraşdırdıqdan sonra konfiqurasiyaya davam edə bilərsiniz. Rahatlığınız üçün konfiqurasiya faylları bu deponun etc qovluğunda yerləşir.

Çox əsas bir nümunə xəritəsi və məlumatları nümunə-xəritə kataloqunda tapa bilərsiniz. Sadə bir test üçün/var/www/example-map-ə kopyalayın.

Konfiqurasiya fayllarını öz yerlərinə kopyalayın:

Və göstərmə daemonunu işə salın

/Var/cache/renderd/plitələr qovluğunun işlənmə prosesini işlədən istifadəçi tərəfindən yazıla biləcəyinə əmin olun.

Brauzerinizə bir kafel yükləməyə çalışın, məsələn.

Mapnik üslub cədvəlinizin yerini və daxil olmaq üçün istifadə etmək istədiyiniz urini göstərmək üçün /etc/renderd.conf redaktə edə bilərsiniz. 10 -a qədər (standart olaraq) mapnik üslub cədvəlini konfiqurasiya edə bilərsiniz - hər bir hissəyə unikal bir ad verin və uri və üslub cədvəli yolunu daxil edin.

Render daemonu belə bir mesaj verməlidir:

Gələn əlaqə var, fd 7, nömrə 1 Fd (7) xml (Varsayılan), z (0), x (0), y (0) göstərin

Disk, Mapnik ilk dəfə məlumatları çəkməyə çalışdıqca çırpmağa başlamalıdır. Bir neçə saniyə sonra, ehtimal ki, 404 xətası görürsünüz. Disk fəaliyyətinin dayandığını gözləyin və sonra plitəni yenidən yükləyin. Bir az şansınız varsa, brauzerinizin pəncərəsində dünyanın bir kafelini görməlisiniz.

Bu baş vermirsə, http səhv qeydini yoxlayın. LogLevel apache direktivindən istifadə edərək ayıklama səviyyəsini artıra bilərsiniz. Heç bir qeyd mesajı göstərilmirsə, düzgün virtual hosta daxil olduğunuzu yoxlayın - mod_tile -in yeni versiyası standart olaraq yalnız bir ana üzərində quraşdırılmışdır. Birdən çox ana qurmaq üçün ya ServerAlias ​​istifadə edin, ya da hər virtual hostda LoadTileConfigFile istifadə edin.

Bir OSM növü qurmaq üçün, Osm2pgsql istifadə edərək PostgreSQL -ə daxil edilmiş OSM xəritəsi məlumatları lazımdır. OSM.xml faylı və xəritə simvolları ilə birlikdə Mapnik göstəricisi ilə birlikdə world_boundaries shapefiles.

Göstərmə, unix və ya tcp yuvasını açan və plitələr işlətmək istəklərini dinləyən renderd adlı çox işlənmiş bir prosesdə həyata keçirilir. /Etc/renderd.conf konfiqurasiya faylında müəyyən edilmiş göstərmə qaydalarından istifadə edərək plitələr düzəltmək üçün Mapnikdən istifadə edir. Onun konfiqurasiyası, göstərmə mövzularının sayını da təyin etməyə imkan verir.

Göstərmə daemonu, mövcud göstərmə mənbələrini nəzərə alaraq ən son görüntü təcrübəsini təmin etmək üçün bir çox prioritet səviyyəsi olan bir növbə mexanizmi tətbiq edir. Ən yüksək prioritet, kafel önbelleğinde hələ də olmayan plitələrin sürətlə göstərilməsində, köhnəlmiş plitələrin yenidən işlənməsində iki prioritet səviyyəsi və iki fonda toplu işləmə sırasıdır. Gecikməni minimuma endirmək üçün işləmə növbələri qısa 32 metatil ölçüsü ilə məhdudlaşır. Əsas fon növbəsinin ölçüsü tərtib zamanı müəyyən edilir, baxın: render_config.h

Mod_tile adlı bir Apache modulu, təmin etmək üçün müntəzəm Apache fayl xidmət mexanizmlərini gücləndirir:

1) Plitələrin müddəti bitdikdə, işləmə daemonundan kafelin işlənməsini (və ya yenidən göstərilməsini) tələb edir.

3) Serverdəki mövcud mənbələrdən və onların nə qədər köhnəlməsindən asılı olaraq sorğuların göstərilməsini prioritetləşdirir.

4) Düz bir posix fayl sistemindən başqa kafel saxlama istifadə edin. məsələn, kafelləri bir ceph obyekt mağazasında saxlaya bilər və ya başqa bir kafel serverindən vəkil edə bilər.

5) Kafelin istifadə müddəti. Kafelin sonrakı işlənmə ehtimalının nə vaxt olacağını təxmin edir və uyğun HTTP önbellek bitmə başlıqlarını əlavə edir. Bu konfiqurasiya edilə bilən bir evristikdir.

Dizinlərin çox böyük olması ilə əlaqədar problemlərin qarşısını almaq və çox kiçik faylların qarşısını almaq üçün. Mod_tile / renderd, işlənmiş plitələri "meta plitələr" də xüsusi karma kataloq quruluşunda saxlayır. Bunlar 8x8 həqiqi plitələri tək bir metatil faylına birləşdirir. Bu, disk sahəsi və inodlardan daha səmərəli istifadə etməkdir. Məsələn, bir çox dəniz kafelinin uzunluğu 103 baytdır. Köhnə sxemdə boş dəniz plitələrindən ibarət bir meta kafel, hər biri 4kB olan 64 inod, cəmi 256kB alacaq. Bu optimallaşdırılmış sxemdə təxminən 7 kB həcmində bir fayl lazımdır. Metatiles daha sonra aşağıdakı qovluq quruluşunda saxlanılır: /[base_dir ]/ [TileSetName ]/ [Z ]/uxsxxxyyyy ]/ bütün plitələr üçün əsas yol. TileSetName, göstərilən üslub cədvəlinin adıdır. Z zoom səviyyəsidir. [xxxxyyyy], ilk 4 bit x koordinatından, ikinci 4 bit isə y koordinatından alınan 8 bitlik bir rəqəmdir. Bu, daha səmərəli giriş nümunələri üçün 16x16 kvadrat plitələri bir alt qovluğa yığmağa çalışır.

Apache, faylların avtomatik olaraq çevrildiyi ""/

mod_tile yüksək performanslı kafel xidməti üçün nəzərdə tutulmuşdur. Altdakı disk sistemi buna icazə verərsə, bir xidmətdə asanlıqla & gt 10k plitələr təmin edə bilər.

Göstərmə performansı əsasən mapnik və postgis performansından asılıdır, lakin renderd əsas avadanlıqları mümkün qədər səmərəli istifadə etdiyinə və çox nüvəli sistemlərdə yaxşı ölçülüyünə əmin olmağa çalışır. Renderd, eyni zamanda çoxlu server göstərmə qurğularını genişləndirmək üçün daxili xüsusiyyətlər təqdim edir.

Müəlliflik hüququ (c) 2007 - 2020 mod_tile töhfəçiləri tərəfindən (bax: AUTHORS)

Bu proqram pulsuz bir proqramdır: GNU Ümumi İctimai Lisenziyanın şərtlərinə əsasən, Pulsuz Proqram Vəqfi tərəfindən nəşr olunduğu kimi, Lisenziyanın 2 -ci versiyası və ya (istəyinizə görə) hər hansı bir sonrakı versiyasını yenidən paylaya və/və ya dəyişdirə bilərsiniz.

Bu proqram faydalı olacağı ümidi ilə paylanmışdır, lakin HİÇBİR ZƏMANƏT OLMADAN, hətta SATILIŞ və ya xüsusi bir məqsəd üçün uyğunluq zəmanəti olmadan. Daha ətraflı məlumat üçün GNU General Public License -ə baxın.


Nominatim PostGIS verilənlər bazası ilə xəritə plitələrini işlətmək mümkündürmü? - Coğrafi İnformasiya Sistemləri

Apache istifadə edərək xəritə plitələrini göstərir və xidmət edir

Git istifadə edin və ya veb URL -dən istifadə edərək SVN ilə yoxlayın.

Rəsmi CLI ilə sürətli işləyin. Daha ətraflı.

GitHub Desktop -un işə salınması

Heç bir şey olmazsa, GitHub Desktop -u yükləyin və yenidən cəhd edin.

GitHub Desktop -un işə salınması

Heç bir şey olmazsa, GitHub Desktop -u yükləyin və yenidən cəhd edin.

Xcode işə salınır

Heç bir şey olmazsa, Xcode yükləyin və yenidən cəhd edin.

Visual Studio Kodunun işə salınması

Hazır olduğunuzda kod məkanınız açılacaq.

Kod məkanınızı hazırlayarkən problem oldu, yenidən cəhd edin.

Bu şöbə yuxarı yuxarı açıq xəritədən qabaqda deyil: usta.

Hələ heç bir yeni öhdəlik yoxdur. Günün xoş keçsin!


Yer təcrübələrini inteqrasiya etmək IFE -ni daha da gücləndirəcəkdir

API ilə xəritəni hər yerdə birləşdirən çevik təcrübələr yarada bilərsiniz. Xəritə məlumatlarını IFE GUI -yə və ya xarici məlumatları xəritəyə inteqrasiya edə bilmək böyük bir sərnişin təcrübəsi təmin etmək üçün çox vacibdir.

API -lərimizin imkanları var:

  • 2D və 3D vizualizasiya ilə xəritə məzmununu və genişlənmiş reallıq baxışlarını birləşdirin
  • Küçə və peyk görüntüləri ilə səyahət və təyinat xidmətlərini nümayiş etdirin

Xəritə məlumat aktivlərini əldə edin və istədiyiniz halda göstərmək üçün İnteraktivdən istifadə edin. GUI -yə inteqrasiya edin, onları push bildirişləri, POP -lar və s.

FlightPath3D REST API -nin xəritə inteqratoru istifadəçiləri aşağıdakı coğrafi detallara daxil ola bilərlər:

  • Təyyarənin ətrafındakı şəhərlər və POI -lər
  • Şəhər adı, enlem, uzunluq
  • Cari yerli vaxt, DST qaydaları, Airport IATA və ICAO kodları
  • POI adları, təsvirlər, şəkillər, enlik, uzunluq
  • Təyyarənin hazırkı mövqeyindən POI -ə qədər olan məsafə
  • Təyyarənin hazırkı mövqeyindən sərhəd xətlərinə qədər olan məsafə, bu xətlərə qədər təxmini vaxt

Sərhəd və sərhəd JSON, mövcud təyyarə mövqeyinə və uçuş istiqamətinə əsaslanaraq məhdud bölgələrin adlarını, məsafələrini və təxmin edilən uçuş müddətini qaytarır.

Hazırkı təyyarə mövqeyi ətrafında müəyyən bir yer və ya coğrafi hasarlanmış bir sahə üçün maraq nöqtəsi JSON məlumatı.

Şəhərlər və Zamanlar JSON, müəyyən bir təyinat, böyük şəhərlər və ya mövcud təyyarə mövqeyi ətrafında coğrafi hasarlanmış bir sahə üçün qurulmuş məlumatdır.

Vizual xəritə aktivlərini əldə edin və onları GUI təcrübənizin bir hissəsi halına gətirin. Vizual xəritə aktivləri, peyk plitələrindən interaktiv xəritələr göstərmək üçün OpenGL istifadə edən C ++ tətbiqimizin bir hissəsidir. Flightpath3D WMS serverinin bir hissəsidir.

Xəritə obyekti səhifənizdəki xəritəni təmsil edir. Xəritəni proqramatik olaraq dəyişdirməyinizə imkan verən üsulları və xüsusiyyətləri ortaya qoyur və sərnişinlər onunla ünsiyyət qurarkən hadisələri atəşə tutur. Flightpath3D serveri xəritəni səhifədə işə salır və Xəritə obyektinizi qaytarır.

3D DÜNYA QLOBASI VƏ UÇUŞ İLƏŞMƏSİ

Qlobus və uçuş yolu xəritəsi aktivləri, peyk plitələrindən interaktiv xəritələr göstərmək üçün OpenGL -dən istifadə etdiyimiz tətbiqin bir hissəsidir.


Bir brauzer oyunu üçün 2D döşənmiş bir xəritə tətbiq etmək/göstərmək üçün yaxşı bir yol nə ola bilər?

Yaqutda bir az RPG kodlaşdırdım və xəritə meydanlarını ehtiva etmək üçün bir sıra istifadə etdim. Dizinin elementləri (X koordinatlarını təyin edən), elementləri Y koordinatını təyin edən dizilərdir və bunların hər biri ərazi məlumatlarını birinci mövqedə saxlayan seriallardır və oyunçu/npc/obyektlər/binalar aşağıdakı mövqelərdədir.

Etməyə çalışdığım şey, bu ərazi məlumatlarını "kvadratlar" ı brauzerdəki 2D döşənmiş bir xəritəyə çevirməkdir.

Xəritənin sürüşdürüldüyü zaman yeniləməsinə və ya dinamik olaraq alınmasına ehtiyac yoxdur (heç olmasa inkişafın bu mərhələsində), amma gələcəkdə bunu etməyə imkan verən bir tətbiq mümkün bir yoldur.

Veb dizaynında/düşündüyüm şeylərin göstərilməsində tam bir başlanğıc olmaq: HTML cədvəlləri, HTML5 kətanları, tam olaraq bu məqsədlə hazırlanmış bəzi JS çərçivələri (bilmədiyim = məsləhət verin).

GameQuery haqqında bilirəm, amma heç istifadə etməmişəm və yeni xüsusiyyətlər (sürüşdürmə, ajax) əlavə edəcəyim üçün hər şeyi yavaşlatacağını bilmirəm.

Həqiqətən başqa alternativlər bilmirəm, bəlkə daha yüngül yanaşmalar varmı? Daha asan və ya daha minimalist yollar? İş üçün doğru vasitə olan daha çox hədəflənmiş JS çərçivəsi? Bəlkə bir neçə html kətan kodu, hətta sadə şəkil xəritələri və ya mütləq yerləşdirmə şəkilləri kifayət edər?

Məsələ burasındadır ki, əvvəlcə bir az məmnunluq gətirəcək, eyni zamanda təkmilləşdirmək üçün yeri olan və yeni veb texnologiyalarına doğru gedən bir şey istərdim.

p.s. Əlbəttə ki, Flash istisna edilmir.

Yeniləyin: sualı daha layiqli bir ingilis dilində yenidən yazın (inşallah) :)


Fon

Müasir veb xəritələri ilə tanış olmayanlar üçün bir addım geri çəkilmək və bəzi anlayışları təyin etmək faydalı ola bilər. Kompüter qrafikasında şəkilləri təyin etməyin iki əsas yolu var: raster və vektor.

Raster Qrafika

Raster qrafikasında şəkillər düzbucaqlı bir piksel ızgarası istifadə edərək təyin olunur. Piksellər, adətən qırmızı, yaşıl və mavi dəyərlərlə təmsil olunan mənbə görüntüsünün nümunələridir. Bəzi ümumi rastr fayl formatlarına JPEG, TIFF, PNG və s daxildir.

Bu şəkillər piksellərə əsaslandığı üçün qətnamədən asılıdır. Buna görə də, müəyyən bir qətnamədə yaradılan bir görüntü yalnız o qətnamədə düzgün görünür. İstənilən ölçüdə göstərildikdə, şəkil yenidən nümunələnməlidir. Bu proses vasitəsilə mənbə şəklindəki diaqonal xətlər kimi şeylər böyüdülmüş görüntüdə "pilləkənlər" və ya "jaggies" kimi görünə bilər. Əsl həyat CSI kimi deyil, yalnız bir raster görüntüsünü bu qədər artıra bilərsiniz.

Vektor qrafikası

Raster qrafikindən fərqli olaraq, vektor qrafikası görüntünün hər bir pikseli üçün məlumat saxlamır. Əksinə, vektor şəkilləri çoxbucaqlar, bezier əyriləri və elipslər kimi daha yüksək səviyyəli primitivlərdən istifadə etməklə təyin olunur. Bu səbəbdən vektor qrafikası qətnamədən asılı deyildir, göstərici cihazın qətnaməsindən asılı olmayaraq istənilən miqyasda dəqiq göstərilə bilər. Ümumi vektor fayl növlərinə EPS, AI və SVG daxildir.

Bir çox qrafik üçün vektor təsvirləri, hər pikselin rəng dəyərini saxlamadıqları üçün əhəmiyyətli dərəcədə kiçik fayllardır. SeatGeek loqotipində gördüyünüz kimi, bir forma yalnız bir neçə qovşaq və nəzarət nöqtəsi ilə təyin edilə bilər. Vektor qrafikası, şriftlər, loqotiplər və xəritələr kimi yaxşı müəyyən edilmiş həndəsi formalardan və əyrilərdən ibarət olan şəkillər üçün xüsusilə faydalıdır.


Mövcud geo sistemlər

Bu fəsildə Apertisin qərar qəbul etməsi üçün faydalı ola biləcəyi üçün sensor məlumatlarını tətbiq paketlərinə çıxarmaq üçün müxtəlif mövcud sistemlərin tətbiq etdiyi yanaşmalar təsvir edilir. Mövcud olduqda, xüsusilə maraqlı və ya uyğun görünən xüsusiyyətlərin tətbiqinə dair bəzi təfərrüatları da təqdim edir.

W3C Geolocation API

W3C Geolocation API, istifadəçinin yerini veb tətbiqlərinə göstərmək üçün bir JavaScript API -dir. API, tətbiqlərə cari yeri sorğulamağa və mövqe dəyişikliyi siqnalları üçün qeydiyyatdan keçməyə imkan verir. Yer məlumatlarının yaşı haqqında məlumatlar (önbelleğe alınmış yerlərə icazə vermək üçün) geri qaytarılır. Məkanın dəqiqliyi, başlığı və sürəti haqqında da məlumatlar verilir.

Android platforma yeri API

Android platforma yeri API, GPS və ya görünən Wi-Fi və mobil şəbəkələrə əsaslanan geolokasiyanı yerinə yetirmək üçün aşağı səviyyəli bir API-dir və coğrafi hasarlanma və ya coğrafi kodlaşdırma xüsusiyyətləri təmin etmir. Geolokasiya və önbelleğe alınmış geolokasiya sorğularına, həmçinin yerdəki dəyişikliklərin siqnallarına imkan verir. Dizaynı, mobil batareyanın ömrünü qorumaq üçün tətbiqləri enerjiyə qənaət etmək baxımından çox qərəzlidir.

Android üçün Google Yer Xidmətləri API

Android üçün Google Location Services API, geolokasiyaya əlavə olaraq coğrafi kodlaşdırma və coğrafi hasarlamanı dəstəkləyən platforma yerləşmə API -dən daha tam xüsusiyyətli bir API -dir. Google Play xidmətlərinə daxil olmaq üçün cihazın internetə qoşulmasını tələb edir. Cihazın yerini platforma API -dən daha çox hesablamağın və izləməyin mürəkkəbliyini gizlədir.

Tətbiqlərə yer yeniləmələrini almaq istədikləri tezlikdə yuxarı və aşağı sərhədləri təyin etməyə imkan verir. Məkan xidməti daha sonra bütün tətbiqlər tərəfindən tələb olunan tezliklərdə maksimum yeniləmələri hesablayır və bunun və tətbiqin istədiyi yuxarı tezliyin minimum həddində siqnal yayır.

Eyni zamanda, yer məlumatlarına daha sərt şəkildə daxil olmaq üçün lazım olan icazələri müəyyənləşdirir, qaba və incə dənizə giriş imkanı verir.

IOS Məkan və Xəritə API

İOS Yerləşdirmə Xidmətləri və Xəritələr API -si həm iOS, həm də OS X -də mövcuddur. Bir çox funksiyanı dəstəkləyir: coğrafi yerləşmə, coğrafi hasarlanma, irəli və tərs geokodlaşdırma, naviqasiya marşrutu və yerli axtarış.

Geolokasiya üçün, arxa planda işləyən tətbiqlərə siqnallar da daxil olmaqla, yer və yer dəyişdirmə siqnallarının sorğusunu dəstəkləyir.

Coğrafi hasarlama dəstəyi nöqtələr və radiuslar üçündür və giriş və çıxış siqnallarını dəstəkləyir, lakin dayanma siqnallarını dəstəkləmir. Bunun əvəzinə bölgə sərhədindən olan məsafəyə əsaslanan histerezi dəstəkləyir.

Geocoding, həm irəli, həm də əks coğrafi kodlaşdırmanın dəstəkləndiyi bir şəbəkə xidmətindən istifadə edir.

MapKit API, annotasiya və üst -üstə düşmə dəstəyi daxil olmaqla, gömülü bir xəritə göstəricisi və vidceti təmin edir.

iOS (lakin OS X deyil), özbaşına naviqasiya təlimatlarının göstərilməsi üçün yönləndirmə təminatçıları kimi ixtiyari tətbiqlərdən istifadə etməyi dəstəkləyir. Bunu dəstəkləyən bir tətbiq, marşrutlaşdırmanın hansı coğrafi bölgələri dəstəklədiyini bəyan etməlidir (məsələn, Nyu -York üçün bir metro naviqasiya proqramı yalnız bu bölgəni elan edəcək) və marşrutlaşdırma istəklərini URI işləyicisi olaraq qəbul etməlidir. URI -lər naviqasiya sorğusunun başlanğıc və təyinat nöqtələrini təyin edir.

Bir şəbəkə bağlantısı tələb edən bir sistem təminatçısından istifadə edərək naviqasiya marşrutlaşdırmasını da dəstəkləyir. Hesablanmış marşrutlar arasında məsafə, gözlənilən səyahət vaxtı, lokalizə edilmiş bildirişlər və naviqasiya üçün addımlar dəsti kimi metadata daxildir. Müəyyən bir naviqasiya üçün birdən çox marşrut seçiminin qaytarılmasını dəstəkləyir.

Yerli axtarış API -si, dəstəklədiyi üçün coğrafi kodlaşdırma API -dən fərqlənir növləri "qəhvə" və ya "yanacaq" kimi yerlərin sayı. Coğrafi kodlaşdırmada olduğu kimi, yerli axtarış API -si də şəbəkə bağlantısı tələb edir.

GNOME API -ləri

GNOME, müxtəlif coğrafi xüsusiyyətlər təmin etmək üçün bir neçə kitabxanadan istifadə edir. Naviqasiya marşrutu üçün kitabxanası yoxdur.

GeoClue

GeoClue, GPS, mobil şəbəkə yeri və Wi-Fi əsaslı coğrafi yer kimi çoxlu giriş arxa tərəflərini dəstəkləyən bir geolokasiya xidmətidir.

Wi-Fi yeri Mozilla Yer Xidmətindən istifadə edir və şəbəkə bağlantısı tələb edir.

Siqnallar arasında minimum məsafə olan, lakin zamana əsaslanan məhdudiyyət olmayan geolokasiya siqnallarını dəstəkləyir. Coğrafi qılıncoynatmanı dəstəkləmir, lakin inkişaf etdiricilər onu tətbiq etməkdə maraqlıdırlar.

GeoClue təhlükəsizlik modeli, icazələrin fərdi tətbiqlərə tətbiq edilməsinə və hər bir tətbiq üçün yer dəqiqliyinin məhdudlaşdırılmasına imkan verir. Bununla birlikdə, bu model hazırda natamamdır və sistemin etibarlı hesablama bazasını (TCB) sorğulamır (TCB və etibar anlayışları üçün Təhlükəsizlik dizaynına baxın).

Geocode-glib

Geocode-glib, irəli və tərs coğrafi kodlaşdırma üçün bir kitabxanadır. Nominatim API-dən istifadə edir və hal-hazırda nominatim.gnome.org saytını sorgulamaq üçün kodlaşdırılmışdır. Coğrafi kodlaşdırma aparmaq üçün şəbəkəyə giriş tələb olunur.

Nominatim API üçün bir API açarı tələb olunmur (əlaqə e-poçt ünvanı tələb olunsa da), lakin onu istifadə edən hər kəsin öz Nominatim serverini işləməsi çox tövsiyə olunur.

geocode-glib tək bir Nominatim serverinə bağlıdır və birdən çox arxa tərəfi dəstəkləmir.

Libchamplain

libchamplain, izahatları və örtükləri dəstəkləyən bir xəritə vidceti təmin edən bir xəritə göstərmə kitabxanasıdır. Birdən çox mənbədən xəritə plitələrinin yüklənməsini və ya göstərilməsini dəstəkləyir.

Navit

NavIt, avtomobillər üçün nəzərdə tutulmuş 3D-naviqasiya naviqasiya sistemidir. Bir GTK+ və ya SDL interfeysi, səs istifadə edərək səs çıxışı, gpsd istifadə edərək GPS girişi və birdən çox xəritə göstərmə arxa tərəfi təmin edir. Paylaşılan bir kitabxana (libnavit) kimi bəzi funksiyalarını ortaya qoyur, amma işin yenidən qurulmadan bir tətbiqdə bir komponent olaraq nə dərəcədə yenidən istifadə edilə biləcəyi bəlli deyil. Üçüncü tərəf naviqasiya tətbiqi olaraq və ya birinin əsası olaraq, dəyişikliklərlə paketlənə bilər.

Naviqasiya sistemləri

Üç alternativ marşrutlaşdırma sistemi, bir çox sınaq başlanğıcına və onlara qarşı təyinat marşrutlaşdırma problemlərinin həll edilməsinə əsaslanan tam bir analizin altında qısaca təsvir edilmişdir.

GraphHopper

GraphHopper, Java olaraq yazılmış, server olaraq və ya oflayn istifadə üçün kitabxana olaraq mövcud olan bir yönləndirmə sistemidir. OpenStreetMap məlumatlarından istifadə edir və Apache License 2.0 lisenziyasına malikdir.

OSRM, BSD lisenziyalı C ++ marşrutlaşdırma sistemidir və server olaraq və ya oflayn istifadə üçün kitabxana olaraq istifadə edilə bilər. OpenStreetMap məlumatlarından istifadə edir.

SİZİN

YOURS, OpenStreetMap məlumatlarından istifadə edərək marşrutlaşdırma üçün bir veb API təmin edən bir onlayn yönləndirmə sistemidir.

NavServer

NavServer, D-Bus üzərindən əsas bir naviqasiya sisteminə daxil olan xüsusi bir ara proqram naviqasiya həllidir. Daxili naviqasiya proqramı kimi istifadə etmək üçün hazırlanmışdır.

NavServer -in məlumatları SDK API -lərinə ötürmək üçün nə dərəcədə istifadə edilə biləcəyi (geolokasiya dəqiqləşdirmələri kimi) hal -hazırda aydın deyil.

GENIVI

GENIVI, geo-xüsusiyyətlərini və naviqasiyasını IVI Naviqasiya layihəsinin çətiri altında müxtəlif komponentlər olaraq həyata keçirir. Təmin etdiyi əsas API -lər aşağıda ətraflı təsvir edilmişdir.

Naviqasiya

Naviqasiya tətbiqi, naviqasiya məlumatları üçün OpenStreetMap istifadə edərək NavIt -ə əsaslanır. Marşrut hesablamasını, addım-addım təlimatları və xəritənin göstərilməsini həyata keçirir.

İki hissədə həyata keçirilir: D-Bus üzərindən yönləndirmə API-lərini ifşa etmək üçün libnavit istifadə edən naviqasiya xidməti və bu API-lərdən istifadə edən naviqasiya interfeysi. Naviqasiya xidməti NavIt üçün bir sıra plaginlər şəklində tətbiq olunur.

Yanacaq dayandırma məsləhətçisi

Yanacaq dayandırma məsləhətçisi, avtomobilin yerini və yanacaq səviyyəsini öyrənmək üçün nə vaxt (və harada) yanacaq doldurmağın ən yaxşı olacağını proqnozlaşdırmaq üçün geolokasiya API və nəqliyyat vasitəsinin API məlumatlarını istehlak edən bir demo tətbiqidir.

POI xidməti

Maraq nöqtələri (POI) xidməti, hər biri fərqli bir provayderdən və ya mənbədən maraq nöqtələri təmin edən çoxlu 'məzmun giriş modulu' (CAM) plaginlərindən istifadə etməklə həyata keçirilir. POI -ləri axtararkən, xidmət bütün CAM -lara bir sıra atributlar və dəyərlər verməklə bir sıra operatorlar (bərabər, daha az, daha böyük və s.) Üstəgəl genişlik və uzunluqdan istifadə etməklə göndərir. ətrafında sorğu. CAM'lar nəticələrini xidmətə qaytarır, sonra da əvvəlcə axtarış tələbi edən müştəriyə göndərir.

CAM -lar təmin edə biləcəkləri POI kateqoriyalarını da qeydiyyatdan keçirə bilərlər. Bu kateqoriyalar bir ağacda yerləşdirildiyindən istifadəçi sorğularını müəyyən kateqoriyalarla məhdudlaşdıra bilər.

Əlavə olaraq, POI axtarışları bir mərkəz nöqtəsi ətrafında deyil, marşrut xətti boyunca maraq nöqtələri taparaq müəyyən bir marşrut siyahısına qarşı aparıla bilər.

Nəhayət, avtomobil hər hansı bir uyğun gələn POI -dən müəyyən bir məsafədə hərəkət edərsə POI sisteminin müştəriyə siqnal verəcəyi 'yaxınlıq siqnalı' xüsusiyyətini dəstəkləyir.

Mövqeləşdirmə

Mövqeləşdirmə API -si böyük miqdarda yerləşdirmə məlumatları təmin edir: vaxt, üç ölçüdə mövqe, başlıq, üç ölçüdə mövqe dəyişmə sürəti, üç ölçüdə bucağın dəyişmə sürəti, üç ölçüdə mövqeyin dəqiqliyi və mövqenin standart sapması. üç ölçüdə və başlıqda.

Xidmət, 10Hz maksimum tezliyə qədər, ixtiyari vaxtlarda mövqe dəyişikliyi haqqında siqnallar verir. Hal -hazırda görünən GPS peyklərinin sayı və bu dəyişdikdə siqnallar haqqında məlumatları ortaya qoyur.

Google veb API -ləri

Google geo-funksionallıq üçün müxtəlif API-lər təqdim edir. İstifadə edilən sorğuların sayına görə dəyişən bir hesablama miqyasına görə istifadə etmək mümkündür.

Google Xəritə Geocoding API

Google Xəritə coğrafi kodlaşdırma API, irəli və tərs coğrafi kodlaşdırma xidmətləri göstərən və JSON və ya XML formatında nəticələr verən bir HTTPS xidmətidir.

İrəli coğrafi kodlaşdırma birdən çox yerdən ünvan formatlarını dəstəkləyir və nəticəni il, ölkə, inzibati bölgə və ya poçt koduna görə süzməyi dəstəkləyir. Həm də müəyyən bir hüdud və ya bölgədəki nəticələrin əhəmiyyətini süni şəkildə artırmağı və nəticələrin bir çox dildə qaytarılmasını dəstəkləyir.

Ters coğrafi kodlaşdırma, bir enlem və boylamı və isteğe bağlı olaraq nəticənin bir ünvan, bir küçə və ya ölkə ilə məhdudlaşmasına imkan verən bir nəticə növü (məsələn) tələb edir.

Həm irəli, həm də tərs coğrafi kodlaşdırma istəkləri ilə qaytarılmış potensial nəticələr sırasına, yerin enlemi və boylamı, onun formatlaşdırılmış simli və komponentlər kimi ünvanı, ünvan haqqında təfərrüatlar (poçt ünvanıdırsa) və göstərilən ünvanda göstərilən xəritə xüsusiyyətinin növü daxildir. bu koordinatlar.

Xidmət, əvvəlcədən tamamlama sisteminin bir hissəsi olaraq qismən daxil edilmiş sorğular deyil, tam sorğuların coğrafi kodlaşdırılması üçün hazırlanmışdır.

Google Places API

Google Places API bir neçə fərqli əməliyyatı dəstəkləyir: istifadəçi tərəfindən verilən axtarış sətirinə uyğun gələn yerlərin siyahısını qaytarmaq, bir yer haqqında detalları qaytarmaq və ehtimal ki, uyğun olduğu yerlərə görə istifadəçinin axtarış xəttini avtomatik tamamlamaq.

Axtarış API, müəyyən bir genişlik və uzunluq radiusunda olan maraq nöqtələrinin siyahısını və onlar haqqında metadatanı qaytarmağı dəstəkləyir.

Detallar API bir yer üçün qeyri -şəffaf bir identifikator alır (Google tərəfindən başa düşülür və başqa xidmətlər tərəfindən deyil) və həmin yer haqqında metadatanı qaytarır.

Avtomatik tamamlama API -si qismən bir axtarış xətti götürür və tam yerin adını simli və komponentlər kimi, girişə uyğun olan hissə və olduğu yerin növü (yol, məhəllə, və ya siyasi sahə).

Google Xəritə Yolları API

Google Maps Roads API, enlem və uzunluq nöqtələrinin siyahısını alan və eyni nöqtələr siyahısını verən, lakin hər biri bir avtomobilin ola biləcəyi ehtimal olunan bir marşrut meydana gətirmək üçün ən yaxın yola bükülən yollar üçün bir keçid təmin edir. qəbul.

Xidmət, isteğe bağlı olaraq, nəticəni fərqli yollarla ayırmaq üçün lazım olan nöqtələri əlavə edərək potensial marşrutu düzgün şəkildə izləmək üçün daha çox bal ehtiva edə bilər.

Google Xəritə Geolocation API

Google Maps Geolocation API, mobil cihazın (cib telefonu qüllələrini və ya Wi-Fi giriş nöqtələrini aşkar edə bilən hər hansı bir cihazın) hal-hazırda görə biləcəyi mobil telefon qüllələri və Wi-Fi giriş nöqtələrinə əsaslanaraq ehtimal olunan yerini axtarması üçün bir yol təqdim edir. .

API, cihazın cib telefonu şəbəkəsi və daşıyıcısı ilə əlaqədar bəzi detalları, yaxınlıqdakı mobil telefon qüllələri və Wi-Fi giriş nöqtələri üçün identifikatorların siyahısını və cihazın hər biri üçün gördüyü siqnal gücünü alır. Cihazın yerləşdiyi yer haqqında ən yaxşı təxminləri, o nöqtənin ətrafında bir enlem, uzunluq və dəqiqlik yarıçapı olaraq (metrlərlə) qaytarır.

Xidmət cihazın yerini müəyyən edə bilmirsə, cihazın IP ünvanına əsaslanaraq geolokasiya etməyə çalışır, bu həmişə nəticə verəcək, lakin dəqiqlik çox aşağı olacaq. Bu seçim deaktiv edilə bilər, bu halda xidmət cihazın yerini təyin edə bilmədikdə bir səhv qaytaracaq.


Xəritə nümunələri

Xəritə Android SDK ilə xəritə xüsusiyyətlərini tətbiq etməyin nə qədər asan olduğunu görmək üçün funksional nümunələrimizə nəzər salın. Tətbiqinizdəki nümunə kod parçalarını istifadə edərək inkişafı sürətləndirin. Bütün bunları Maps Android SDK Nümunələri tətbiqi ilə sınayın!

Xəritə Ekranı

TomtomMap, bir çox xəritə qatından ibarət olan müxtəlif variantları ehtiva edir: xəritə plitələri və trafik plitələri.

Xəritə plitələri

Vacib: 2020 -ci ilin may ayında vektor və raster plitələr arasında keçid üçün istifadə edilən üsullar ləğv edildi və bir ildən sonra silinəcək. Bu nöqtədən etibarən, raster plitələrini göstərmək üçün üslubu raster təbəqələri olan birinə yenidən yükləmək tələb olunacaq. İstifadə müddəti bitməzdən əvvəl, raster və vektor plitələrini ehtiva edən üslubla bir xəritə hələ də işə salınacaq. Ancaq üslubunuz Style Birləşməsindən əldə edilirsə, burada təsvir edilən MapProperties -də MapStyleSource -u STYLE_MERGER olaraq təyin etməlisiniz. Bu yanaşma yalnız vektor plitələrini yükləyəcək.

Xəritəni göstərmək üçün xəritəni göstərmək üçün lazım olan məlumatları özündə birləşdirən bir xəritə tərzi faylı təqdim etməlisiniz. Mənbələr, kafel növləri (məsələn, raster və ya vektor) və kafel xidməti üçün URL -lər haqqında məlumatlar daxildir. Ətraflı məlumat üçün Xəritə Stil Spesifikasiyasına baxın. Xəritə SDK -da standart xəritə görüntüsü vektor plitələrinə əsaslanır. URL -ni Vector Tile son nöqtəsinə təyin edən bir xəritə tərzi faylından istifadə edir. Xəritə və trafik görüntüsü üçün standart stil faylı Style Birləşməsindən alınır. Xəritələr SDK -da raster plitələrlə bir xəritəni göstərmək də mümkündür. Bunu etmək üçün, raster növünü və raster plitələrinin son nöqtəsi URL -ni təyin edən bir xəritə tərzi təqdim etməlisiniz. Bu stil Maps SDK -ya yüklənməlidir. Bu nümunə, TomTom raster plitələrini göstərmək üçün istifadə edilə bilən və Xəritələr SDK-da belə bir üslubun necə istifadə olunacağını göstərən sadə bir JSON üslublu fayl təqdim edir.

Raster plitələr şəkil kimi təqdim olunur. Göstərmək üçün daha az işləmə gücü və yaddaş tələb olunur, lakin vektor plitələrindən daha böyük bir fayl ölçüsünə malikdir.

Vektor plitələr coğrafi nöqtələr, meşələr, göllər, qurulmuş ərazilər (çoxbucaqlılar) və yollar (xətlər kimi) kimi xəritə girişlərini təsvir edən məlumat formasını alır. Stil vərəqi vasitəsi ilə tərtib olunur. Vektor plitələr keyfiyyətini itirmədən fərqli ölçülərdə ölçülü ola bilər. Vektor plitələrinin fayl ölçüsü raster plitələrdən daha kiçikdir.

İstifadə nümunəsi 1: Tətbiqiniz xəritəni göstərmək üçün raster plitələrdən istifadə etmək üçün hazırlanmışdır. Tətbiqi TomTom Map Display API raster plitələri ilə yeniləmək istəyirsiniz.

İstifadə nümunəsi 2: Xəritə 2.5 D perspektivi, xüsusi xəritə üslubları və s. Kimi vektor plitələr xüsusiyyətlərindən istifadə etmək istəyirsiniz.

Nümunə istifadə nümunəsi 3: Tətbiqiniz fərqli imkanlara malik cihazlarda işləyir. Güclü cihazlarda xəritəni göstərmək üçün vektor plitələrdən və daha az işləmə gücünə malik cihazlarda raster plitələrdən istifadə etmək istəyirsiniz.

Xəritəni raster və ya vektor plitələri ilə göstərmək üçün tətbiqinizdəki aşağıdakı kod parçalarını istifadə edin.

Xəritənin necə başladığından asılı olaraq, raster və vektor plitələri arasında keçidin iki yolu var.

Xəritə, STSLE_MERGER olaraq təyin edilmiş MapStyleSource ilə başlanğıcdırsa, raster plitələrə keçmək üçün, mənbə adlarını uyğun olaraq təyin edən uyğun Raster təbəqələri ilə üslubu yenidən yükləməlisiniz. Raster üslubu URL -dən yüklənə və ya aktivlərdə saxlanıla bilər. Aşağıdakı nümunələrdə istifadə olunan üslubları Android Nümunələri üçün MapsSDK -da tapa bilərsiniz.


Nominatim PostGIS verilənlər bazası ilə xəritə plitələrini işlətmək mümkündürmü? - Coğrafi İnformasiya Sistemləri

Şəxsi həyat tərzinin ən yüksək səviyyəyə çatdırılması ən çox öyrənilən mövzulardan biridir. Ətraflı məlumat əldə etmək üçün OSM -i seçin:

Əməliyyat sistemi OSM: texnologiya və texnologiya ilə əlaqədardır.
Ətraflı məlumat əldə etmək və ya istifadə etmək lazımdır.

Mən uzun müddət OpenStreetMap -ə töhfə vermişəm və uzun müddət OpenStreetMap -ın tərəfdarı olmuşam, lakin mülkiyyət xəritələşdirmə dünyası məlumat keyfiyyətində yaxşılaşmağa davam edərkən layihə dayandı. Pulsuz və Açıq məlumatlara əhəmiyyət verənlər üçün bu bir problemdir. Bu yazıda, OSM -in dayandığını düşünməyimin səbəblərini və layihəni yoluna qaytarmaq üçün həll yollarını araşdırıram.

2008 -ci ildən təxminən 2016 -cı ilə qədər OpenStreetMap layihəsinə töhfə vermişəm. Layihəyə çox sərmayə qoymuşdum. In that time, I mapped, organized mapping groups in two cities, contributed to the founding of OpenStreetMap US, a non-profit dedicated to OpenStreetMap in the United States, gave talks on and about OpenStreetMap, contributed to the OpenStreetMap.org codebase, mentored two students for OSM through Google Summer of Code, started a working group dedicated to import of data into OpenStreetMap in the US, created and coordinated a massive bot run in the US, moderated the Reddit page r/OpenStreetMap and was a member of the OpenStreetMap Data Working Group, which gave me escalated privileges (both politically and technically) for the project. There are few parts of OpenStreetMap where I didn't have some either direct or indirect involvement.

I'm also the author of an article called Why the World Needs OpenStreetMap, which appeared in two large publications, The Guardian Online and Gizmodo, was on the front page of Hacker News twice and translated into at least four different languages. I was a proud OpenStreetMap advocate!

Before I criticize the project, I want to state emphatically that I still believe wholeheartedly in the core principles of OpenStreetMap. We need a Free as in Freedom geographic dataset just as much today as we did in the past. When I wrote my article about OSM in 2012, self-driving cars and other services were still a dream. Today the importance of having a highly accurate, libre geographic dataset is more important than ever, and I support those working to make it happen.

That said, while I still believe in the goals of OpenStreetMap, I feel the OpenStreetMap project is currently unable to fulfill that mission due to poor technical decisions, poor political decisions, and a general malaise in the project. I'm going to outline in this article what I think OpenStreetMap has gotten wrong. It's entirely possible that OSM will reform and address the impediments to its success- and I hope it does. We need a Free as in Freedom geographic dataset.

As long as this post is, it's not a comprehensive list of all the problems with the project, only the ones I found most directly affect the project's success and that I wasn't able to address myself during my time on the project.

When the World Needs a Map, Give them a Database

The first problem that I feel plagues OSM is that the OpenStreetMap Foundation views the mission of the project to provide the world a geographic database, but not geographic services. OSM gives people the tools to create their own map rather than offering them a simple, out of the box solution. Providing the ability for individuals and organizations to make their own map may work well for some, but it discourages small and medium size organizations from using OSM and thus engaging with the project. And even if they do use our data, their engagement is through a third party, rather than directly with us.

When you go to OpenStreetMap.org, you see a map and a few extras, such as a search window, along with a few extra buttons such as "Log In" and "Edit." It would be reasonable to assume that OpenStreetMap is a map, like Google Maps or other map projects, but while there is a map on OpenStreetMap.org, OpenStreetMap doesn't want you to use it. Instead, they want you to use the information from OpenStreetMap to make your own map, or find someone else to make the map for you.

If you find this strange or confusing, you're not alone.

A map is nothing more than a visualization of a collection of facts. We can understand this in terms of geometry. Let's imagine a furniture store called Frita's Furniture. Our map is a simple two-dimensional plane just like we had in geography class, and it's at 10,10. We might also imagine a road called Main Street that runs from location 2, 9 all the way down to 15, 9.

The location of the store and the road are geographic facts, but if we wanted to represent this data visually, we'd typically use a map. We'd choose just how to draw the road. Would we use a simple line or a more road-line picture? How wide should the line be? What color would it be? Where would we put the name of the road? We could put it across the line, or alongside it, or some other way entirely. And do we want to represent the store as a dot, or an icon of a store?

Years ago, map makers would handle this process manually, but with computers, we generally call this process map rendering, and there are many decisions around the rendering of a map, such the usage of the map, local conventions and even just keeping within a given organization's map style.

But most people don't care about any of this. They just want a map. OSM has a map on its website but discourages its use by third parties. Instead, users are expected to either find a commercial service to render the map for them or else do it themselves.

The project leaders claim that this is because they want people using OpenStreetMap to understand the difference between the geographic data and its visual representation and to encourage a free market ecosystem of rendered map providers, but it's also a fact that many of the individuals who push for this separation also sell commercial map services. I explore this conflict of interest later in this post.

I mentioned earlier that OSM discouraged use of its maps on other websites. It does this through technically enforced usage policies. Understanding a usage policy is usually a straightforward process. An individual or organization gets permission to use a service a certain amount. We could imagine this being done by the number of map requests, or by bandwidth, etc. But OSM's usage policy is entirely different. They allow but discourage the use of the free map and then disallow any single application that is using over 5% of the map bandwidth. This policy is bizarre on several levels.

To understand why this is so strange, we can use an analogy. Let's imagine that I make ice cream. I put the recipe for my ice cream outside my house and suggest people make their own. I also offer free samples out of my home. Above my door, I hang a sign saying "Please don't ask for free samples". Then when people come in and ask for a sample, I give it to them. People may spread the word about my free ice cream and suggest their friends use it. Imagine we have a person named Fred who is a fan of my ice cream and recommends that all his friends go to my house for ice cream. I continue to dish out free ice cream to anyone who asks. But if one individual like Fred refers too many people to me, I will cut off access to everyone Fred sent.

Furthering this analogy, I will tell Fred's friends that they've eaten too much free ice cream, instead of telling Fred. And how many people is too many people? The answer for OpenStreetMap is anything over five percent of the total amount of free ice cream that I've dished out that day. Fred has no idea how many people I've served, so the only thing he can do is ultimately not refer people to my house.

This analogy works because no since no single service knows what any other service is doing, there's no way to know how many other applications have requested how many map requests. Also, since the top services and applications will change over time, you may be fine one day and in trouble the next. Again, there's no way to know. And when you do cross the line of using the service too much, your users would get an unfriendly message about unavailability, not you.

OSM could create standard usage policy, spelling out exactly how much free usage is allowed. It could also choose to create "premium membership" and encourage people to use its tile service (rendered map) service, but right now, using OSM tiles without going through a third party is hard.

When you type an address into a map and it gives you the location, that is called Geocoding. When your GPS or phone knows where you are and gives you a building or street address, that is called Reverse Geocoding. The geocoder featured on OpenStreetMap.org is called Nominatim, and it's awful.

Nominatim is not the only OSM geocoder. Much like the map rendering, it is possible to write your own or use a commercial geocoding service. But Nomatim is the most popular geocoder available for OpenStreetMap, it's used on the website and Nominatim is the service that is listed on OpenStreetMap.org under its APIs.

In its defense, let me say that Geocoding is hard and Nominatim itself is quite complex its almost a feat of engineering. The developers who work on it put enormous effort into writing Nominatim. The problem is that such software needs to be maintained or sometimes replaced entirely to be useful. While there have been Nominatim maintainers, it's not been given the time or attention that it needs and deserves.

To understand why Nominatim is bad, one has to understand how most people use a geocoder. They're most often looking up a business or something vague like "Staples downtown Springfield". That simple three letter query is asking quite a bit. It is asking the computer to know what Springfield is and to limit the query to that. It's then asking to limit it to (or near!) an area called "downtown", and finally, it's limiting results to Staples.

But Nomintim can't handle such queries. It can barely handle simple address queries, such as "123 Main Street". As an example, if I typed an address into Nominatim near my location in New York City, it might come up with a result in Iowa, which for whatever reason, it's more inclined to offer me.

If I try to specify my location as "Manhattan", as of the time of this writing Nomintim will first assume that I mean Manhattan, Kansas, ignoring both the prominence of Manhattan in New York and the fact that the query itself is originating from New York City. Worse still, it's not possible to search for intersections. If I type "53rd and 6th, New York City" into Nominatim, it doesn't understand it. Even if I try to refine the search as "53rd Street and 6th Avenue, New York City", it doesn't work. Intersections are not addresses to Nominatim. It doesn't understand stores, or "near" or categories such as "restaurant". The results it comes up with are often irrelevant, and the service is quite slow.

While other geocoders for OSM exist, such as Pelias and Photon, only Nominatim is run and supported by the OSM Foundation.

No moderation/review model

One of the most significant technical problems with OSM is the lack of a review model, that is for a change to the map to be staged and then reviewed before being applied. Not having this functionality caused ripples of problems throughout the system, some of which I'll discuss here.

Editing on OSM can be challenging for a beginner, and as the project tried to attract new mappers (editor contributors), we would run into people who just mapped incorrectly. Unfortunately, because OSM's data model doesn't include a review stage bad edits are committed to the map and often left undiscovered, or even if they're removed, the original editor doesn't usually see why.

Having the ability for a mapper to contribute changes and then have those changes be reviewed would have potentially left the map with higher quality data and a sort of mentorship model between new contributors and more experienced editors.

I hoped that this would be improved when I mentored a feature placed into OpenStreetMap called "Changeset Comments", in which users could leave feedback for one another's changes. Unfortunately, this ended up not being something many people used constructively, and it was a mess.

Without Moderation, Bots are Hard

Bots could be very useful in OSM in finding mistakes caused either by inaccurate data sources or by editing blunders. For example, if there was a road named "Main Street" connected to another road called "Main Stret," it was likely a spelling error and should be corrected. But it would be a good thing if changes were reviewed by a human being first.

But since OSM doesn't provide any mechanism for reviewed edits, these kinds of suggested changes don't exist. Either bot edits are executed without oversight, which could lead to errors, or they aren't done at all and the project misses out.

Imports are challenging for a variety of reasons, but having a moderation or review model would make things much easier by allowing changes to be staged. The inability to stage and review massive changes to the map have caused problems in the past and many bad imports go unnoticed. If the project instead required that a human review edits before being committed to the system, bad imports could be detected before they cause problems.

Due to the lack of staging inside OSM itself, staging systems have been written for other OSM related projects. These systems often require editors to then manually place those changes in OSM. This process is labor intensive and makes some imports so challenging that they die before they begin.

Vandalism is hard to manage

Like Wikipedia, OSM has people who purposefully vandalize the project. Vandals have a variety of motivations. Some vandals are your run of the mill Internet trolls who enjoy causing problems. Sometimes a company wants something on the map despite community consensus against it and change the map to suit their needs, even if the project as a whole is against it. Sometimes mappers use OSM to make political statements such as in the case of disputed territories, and sometimes a geospatially based game, such as Pokemon Go, will use OSM to generate its data and players find that they can change the map to gain an advantage. Whatever the reason, OSM has vandals.

Vandalism is difficult in OSM because without a moderation system, it has to be "cleaned up" rather than prevented in the first place. Detecting vandalism is difficult. Several people ran monitoring tools to try to find problematic edits and imports. I was one of those people.

Even if problematic edits are detected, removing then means making even more edits. The history of the project is littered with lots of small changes that are only there to remove some previous change. Worse still, if the vandalism isn't detected early then someone else might modify an object that was previously vandalized, creating a situation in which either a tool or a person would have to separate the good edits from the bad, a manual process that can be labor intensive.

A moderation tool would prevent much of this. Many vandals would find that their work would not get into the database and would move on. While some malicious edits would still get through, we would be able to address a majority before it became a problem.

One of my contributions to OpenStreetMap was working to improve MapRoutlette, a tool which helps find problems in OSM and offers users the opportunity to fix them. One feature that we wanted in MapRoutlette was to be able to present users with simple "Yes/No" type questions. Unfortunately, while not impossible this would have been a complicated task in OpenStreetMap. If these edits could have gone to a moderation queue, we could have been more confident, and possibly not needed MapRoutlette at all in some cases.

Many developers wanted to solve this same problem, offering the ability to add helpful but anonymous edits to the project. But since OpenStreetMap requires every edit be committed by an individual user, rather than a company or bot account, the barrier of entry for casual mappers was often too high.

Most geographic databases use a layered approach to represent different features. One layer may represent political boundaries another may represent the road network, a third may represent water features, and so on.

Instead of the traditional layers, OSM chooses to use a single layer and then tags (key/value pairs) on individual objects. At first this seems like a good idea, but ultimately it ends up creating a huge mess.

Tools are Harder to Write

Imagine if we wanted to write an editor for OSM that only worked with the road network. This task would seem straightforward in that we would just need to extract features that correspond are tagged as road, such as highway=*. Unfortunately, it's not that simple.

First, an editor that edits these road features must not only pick up the roads (ways in OSM terminology) but also the points (nodes) that make up that road. Secondly, if the road is particularly complicated, it may be represented as a relation. Editing this way is time consuming but straightforward.

What is not as straightforward is that a feature such as a road may also be playing double-duty as another feature, such as a political boundary, as may any of its associated features. Editing roads may inadvertently result in changing a political boundary.

Having map features that represent such radically different meaning puts an onus on both tool makers and the individual editor working on OSM to be aware of any changes they make possibly having consequences that go beyond what they think they're doing.

Imports Are Difficult Without Layers

One of the keys of the Free and Open Source software movements have been code reuse, the idea that you can integrate software together from different sources and have it work seamlessly together. One would think that it would be much the same with geographic data, but because of the lack of layers, it's very challenging to import data into OSM.

Without layers, it's difficult to extract a specific region by feature and analyze or replace that. Instead, because of its complex tagging system, it needs to be analyzed as a whole. Imports are possible but made more difficult without layers to make the job of data analysis by isolation easier.

No Support For Observational, or Other Datasets

One of the core tenants of OpenStreetMap is that it only stores persistent, personally verifiable data. The only exceptions to this are political boundaries- and even these exceptions can be problematic. Unfortunately, this also presents a problem with third parties want to use OSM for things outside of the project scope.

As an example, let's take Pokemon Go. Pokemon Go is an augmented reality game in which real-life features are connected with imaginary creatures in which the player must battle and collect. The frequency and location of where these creatures appear is based on various map features.

Pokemon Go players wanted to use OSM to document the location of creatures to make it easier for other players to find rare creatures and improve their collection. OSM disallows this kind of data in the same way that it might for bird watchers- while it's interesting, the impermanence of this data made it a poor candidate for the project and thus the data would be immediately removed.

But it doesn't have to be something as trivial as a game- layers could also allow other specialized data such as potholes, red light cameras or even bird or animal sightings. It would make the project useful to many more people.

In any database, objects have an ID field, usually a numeric value to look the record up by. OSM is no different and every object inside OSM has an ID field. Unfortunately, in OSM the ID fields represent the low-level objects rather than any high-level concept. This creates a huge problem. I will call this idea a "Conceptual Object", and show how the lack of permanent IDs for them is problematic.

To understand why the lack of permanent IDs is a problem, we have to dive a little deeper into how OSM works. While many of these low-level details are beyond the scope of this article, I will present the basics of how OSM stores information. A point in OSM is called a node, and every node has an ID. Points may be collected into a line, and that line is called a way, and collections of nodes and ways may be combined into a more complex object called a relation. A relation may also contain other relations. Nodes, ways, and relations all have ID fields.

To illustrate this, let's think of a building, that building has properties. The building is at a certain location, it's a specific size, shape, and has an address. If it's large enough, it may have multiple addresses. But the concept of the building is unified. In OSM, that building could be represented by a single node, representing the address. Or a building may be represented by a way of the building outline, or a building may be represented by a relation, encompassing details of the various building elevations, levels, and roof types. The problem is that if I'm doing a lookup, there is no straightforward way to ask about the building. Instead, I will have to look at aspects of the building, such as its address, or its location.

As strange as this may seem, it's entirely possible in OpenStreetMap to take a node from one side of the world, move it to the other side of the world and use it for something else entirely. For example, it is technically possible to take a part of a house, move it to another continent and use it as part of a road. While this is highly unusual, this is not disallowed. If I look at the history of the node, I will see it move. While this may keep the history of the element, it does not keep the conceptual history of an object.

For example, if we start with a representation of an object being the building as a single node, then move to a complex relation, that won't be reflected in the object history, and thus the changes over time are lost.

Permanent IDs on conceptual objects could help with this by providing a history of what the data represents rather than just the data itself.

Amongst other problems, not having a permanent ID for a conceptual object in OSM is the challenging of conflating objects in OSM to objects in other datasets. For example, if we're given a building database from a local government, each building in that dataset will have an ID. We will want to compare that ID to our existing objects. Unfortunately, to do that, we're left with two choices- either we create a new identifier (key) in which to do the conflation, or we have to use the second dataset's ID inside OSM- neither of which is an optimal solution.

It's Hard to Build Connections to Other Datasets

Many people have envisioned projects that connect to OSM to offer reviews or other data associated with OSM, but without a permanent ID, this is not practical. Objects in OpenStreetMap may contain some data such as cuisine type or opening hours along with the name and address, but the review site will need to be able to have a permanent link to objects in OSM, which it can't currently.

No Standards in Data Representation

In OpenStreetMap, there are no formal standards in the project for the representation of features on the map. As an example, let's take the example of a sidewalk. Sidewalks are useful things to have on a map because they tell us if the road is pedestrian friendly. Sometimes sidewalks are represented by an attribute on the road itself. Sometimes sidewalks are represented as a line (way) that runs parallel to the road. Sometimes those ways have the name of the street as their own name, and sometimes they don't have any name at all.

If you are a mapper, this is confusing, since there's no one standard way to map things. If you're trying to build tools to work with OpenStreetMap, the lack of standardization of data across the project makes it challenging to work with as a whole.

There is an informal process for data representation, mainly done on the Wiki, but because this isn't formally enforced, and changing data en mass may be considered a form of vandalism, data consumers are forced to write tools that accept many representations of the same data.

The APIs are Slow to Evolve

As of writing, the current official OpenStreetMap API is 0.6. The API hasn't version hasn't changed since 2009. While a stable API can be a good thing for a mature software project, in the case of OpenStreetMap, this is as more a reflection of poor project management.

An API is part of a protocol that either allows a client to talk to a server or for servers to communicate with each other. In this case, we're talking about OpenStreetMap's editing API which is used between OSM and editing software.

The OpenStreetMap editing API is very powerful and complete, but it has some design choices that made sense in 2009 that have largely been replaced by better technical options in nine years since. These include small changes, such as the data serialization format, as well as more significant changes such as the internal data representation.

As an example, in 2012 there have been several proposals made to create a new datatype called an a area that would greatly simplify the representation of certain types of geographic features. Despite this and the offer of technical help, the project has not made any significant progress on this or other important technical issues.

OSM has Hidden Gatekeepers

Dovetailing on the previous section, we have to ask why the project has not made more technical progress, and the answer is that sadly the keys to the OSM castle largely do not lie in the hands of the OpenStreetMap Foundation, but instead in the hands of one or two individuals who act as gatekeepers to the project's source code and infrastructure.

While it's not uncommon for a Free Software or Open Source project to have a "Benevolent Dictator for Life", these roles are often replaced by a more formal structure as the needs of the project grow. In the case of OpenStreetMap, there is a formal entity which owns the data, called the OpenStreetMap Foundation. But at the same time, the ultimate choices for the website, the geographic database and the infrastructure are not under the direct control of the Foundation, but instead rest largely on one individual, who (while personally friendly) ranges from skeptical to openly hostile to change.

As a former professional system administrator, I relate strongly to these types of individuals. At the same time, the desires of them need to be balanced by the overall needs of the project to make progress and keep momentum to keep its userbase happy and engaged.

That is not the case here, and it's to the detriment of the project.

The OpenStreetMap Foundation Culture

It would be easy to think about the OpenStreetMap Foundation (the OSMF) as similar to the Wikipedia Foundation, but aside from the high-level view of being the holder of Free Data, the two projects are managed radically differently.

The Wikipedia Foundation is a multi-million dollar organization that not only manages Wikipedia but other projects as well, such as the lesser known Wikidata and Wikinews. These projects aid in the organization's broad mission to provide high-quality information to the world. To serve this mission, Wikipedia spends a great deal of money on its infrastructure as well as directing and funding development of new tools for the community to use.

OpenStreetMap, on the other hand, relies primarily on donated hosting services and runs on a shoestring budget. It has no paid employees and does not fund or direct the development of its software base.

This has lead to some organizations trying to take up the mantle and improve the situation, including an organization that I helped found called OpenStreetMap US, which is a US based non-profit organization focused on promoting OSM in the United States. Among our goals for the organization was to fill in the gaps of development and mapping resources by the OSMF, which we partially succeeded in doing, but because of the fragmentation of organizations, we were less successful than we hoped.

In addition to OpenStreetMap US and other "chapters" around the world, there is the Humanitarian OpenStreetMap Team, whose mission it is to help promote OSM in developing nations and rally the OSM community during humanitarian crises. There is no reason that HOT needed to be an independent organization other than the unwillingness by the OSMF to expand its role. Even Steve Coast, one of the founders of OpenStreetMap saw and tried to address this problem with his organization, "Map Club."

The obvious question is why the OpenStreetMap leadership takes the positions that it does, despite the clear need for change. The answers in my view are commercialism in the project, along with a cultural desire to retain the feel of the project's early days.

While there are companies built around Wikipedia's engine (the Wikimedia Server), there are not many companies making money from repackaging Wikipedia. OpenStreetMap, on the other hand, has a commercial ecosystem around it, largely from the business of creating customized maps for customers.

Many of the founders of the project, as well as others, have launched commercial services around OSM. Unfortunately, this creates an incentive to keep the project small and limited in scope to map up the gap with commercial services which they can sell. This also applies to HOT, which has a financial incentive to get grant money for itself and not have those resources going to the OSMF.

In addition to these conflicts of interest is a desire to keep the project small in scope by senior members of the community who see the project as being about people and the mapping hobby and want to avoid imports or other activity that could be seen as removing the human factor from the project. They also see the dangers inherent in creating an organizational structure that demands money and fears it would create a perpetual cycle of needing to find donors simply to support a management layer.

I disagree and view the lack of a more active structure by the OSMF as the cause of the project's both stagnation and significant commercial influence.

When OSM was launched, governments did not release their data under free licenses. They only began doing so because OSM exists now as competition. Yet due to the problems I've outlined, OSM imports are difficult, and updating imports, once they get in OSM is nearly impossible. This is a critical problem for the project.

Similarly, when OSM was launched, drones were not cheap and available. AI wasn't able to do good visual detection of roads, and flying cars were still science fiction. Now all of these tools exist, and yet OSM is still stuck largely editing by hand.

If OSM relies exclusively on manual labor and be unable to work with other datasets, its data quality will continue to decline and the project will ultimately stagnate and fail.

It may appear at first that this article is a comprehensive list of everything I find wrong with OSM. It's not. There are many more concerns I have about the project, but I've limited my article to the scope of concerns I have that I feel are stopping the entire project from progressing. There will be time to fix the small issues if (and only if) the project as a whole succeeds. If it doesn't, then the small nit-picky problems are going to be irrelevant anyway.

It's my sincere hope that this article will be a call-to-action for OSM. There are many brilliant and inspiring individuals in the project. If I'm am a pun, I hope OSM will once again find its way.


4 Cavablar 4

I'm currently working on a terrain mapper, that should do exactly what you want. First of all i pregenerated all transitions between the tiles (so per 2 terrain types there would be 2 tiles for the plain terrain textures and around 12 tiles for the transitions). As the number of needed tiles would grow pretty high, when you have multiple terrains and want to support transitions between all the terrain, the tileset would grow pretty big.

Now currently I'm working on another approach, that in theory (and in my prototype) worked pretty well. I still have to implement it, so the needed tilesets are created on the fly, but this is how I do it:

I have a terrain definition, where all terrain types (for example water, grass, rocks, mountains, desert etc.) are stored. After that I establish an order. I'll explain later, why this order is needed. This order defines, how the different terrain types are related to each other. For example, water is lower than sand (beach), sand is lower than grass, grass is lower than mountains. Therefore you can also say, that water and sand are lower than mountains.

Now I have a special alpha texture, that defines the possible transitions.

Here is the tileset I used in my prototype:

You can see, that you have some terrain textures and an alpha map. I handle the alpha map also as tiles, but they are half sized (terrain textures are 64x64, blend textures are 32x32), this means that every terrain can have up to four blend textures (northwest, northeast, southwest, southeast).

Now basically what you do, when you have a transition is this: - Draw the ground texture (blends are always applied on the higher terrain types). - Draw the alpha map with ALPHA_MAP (this only renders the alpha channel) - Draw the second texture with ALPHA_BLEND (this uses the underlying alpha channel, we rendered out before as alpha for the tile).

So basically this is the theory. But you need to do some things, that it works properly.

  • First generate the level (I use perlin noise, to assign the different terrain types). The output is simply a 2d array containing the terrain types (eg: water, dirt, sand).
  • A processor goes through this array and checks for some things and outputs a MappedTileLayer (this is my datastructure, to hold the output). The processor does following:
    • Map all terrain types to the according tile in the mapped layer.
    • Find tiles, that have neighbours with different (lower) terrain types. If there is a lower neighbour, you also have to render this neighbour terrain underneath actual terrain tile, as otherwise the terrain would just blend to black.
    • Based on the neighbours, the correct blend tiles are used. Every terrain type consists of 4 blend tiles. So depending on the existing neighbours, the blend tiles are chosen.
    • Render all tiles without any transitions (also render the lowest terrain, where blends will be applied). The tiles rendered in this run can be rendered without the need to apply a blend, as they are the lowest terrain tiles.
    • Select first overlay tile (currently there are max 4 overlayes. This is the case, when the tile handled has the highest height in relation to the neighbours and every neighbour is from a different terrain type).
      • Render the four blend tiles with ALPHA_MAP
      • Render the overlying tile with ALPHA_BLEND
      • Repeat this step with the next overlay tile, until there are no tiles left

      Like this, you do not have to care about multiple terrain types getting together, as they are rendered from lowest to highest terrain type and the transtitions only concern the higher type.

      I know that it is a bit complicated at first, but I currently don't have more graphics, because I'm in the middle of refactoring my source. I will add some graphics representing what I do as soon as possible (also better explaining every step).

      I hope this will help you.

      One small addition: My mapper is built, that there is a default blend texture. But you can define specific blend textures for every terrain type. So for example if you want to make smoth transitions for all mappings besides the beach to water transition, you put the smooth transition as default and only set the custom transtition for the beach tiles. Also, my mapper allows to define multiple transition tiles for each tile type (so if you have a straight edge, you can make multiple blends, so they will alternate).

      ** Appended ** Because I currently have no assets to show, I created a schematic drawing in paint.net. Keep in mind, I'm a programmer and not and 2d artist, so artistically it is very badly drawn, but it should show, how I tackle the problem with multiple terrain types (>2) coming together). I left out optimizations for simplicity and applying the blending is also not mentioned, as I concentrate on the problem with the multiple terrains.

      I will add an example with real textures and blends as soon as I find the time to do so, so this gfx is only temporary.

      A explanation to the image I added:

      1. In the first grid you see the terrain configuration. W stands for water, S for sand and G for grass.
      2. The second grid shows, how the blend tiles are applied. Like I mentioned earlier, the width and height of the blend tiles is the half of the terrain tiles.
      3. Here now the first render action happens. The lowest terrain type is water, so we fill all the cells (and all adjacent cells) with the water tiles. So allthough the water tiles only fill the first column of our definition, we have also to fill the second column.
      4. Now we draw the next layer, but we only draw the tiles, that won't be blended. Water is a lower terrain then sand, so we do not need to expand to that side. But because the grass is higher, we have to fill the adjacent tiles with sand, where the grass blend will be rendered over.
      5. Now based on some patterns, we render the blending parts of the sand. (Now you see, why we need to also fill the adjacent tiles).
      6. Here we have repeated steps 4 and 5 (allthough step 4 wouldn't produce any output, as all grass tiles in this examples will contain a blend).

      Now you see, in the fourth row in the second column, there is a grass tile. Left of it is a water tile and on top and bottom of it are sand tiles. When we look at the rendering only for this tile, this is what happens:

      • The water tile is rendered without a blend.
      • The sand tile is rendered with a blend.
      • The grass tile is rendered with a blend.

      And we could also switch one of the sand tiles and the grass tile on the right to different terrain types, it would still produce correct results.