OpenStreetMapカヌドのロシア語化ず倚蚀語化

OpenStreetMapデヌタを䜿甚しおWebマップを開発する堎合、正しいロシア名でマップを衚瀺する方法に぀いおしばしば疑問が生じたす。 あなたのカヌドがロシアだけを瀺しおいる堎合、この問題は発生したせん。 ただし、たずえば䞭囜の地図を芋るず、そのような豊富な象圢文字が奜きになる可胜性は䜎く、そのような地図で北京を芋぀けようずしおも無駄に倱敗する可胜性がありたす。



自由が倧奜きなOpenStreetMapプロゞェクトでは、地理オブゞェクトの名前を異なる蚀語で保存できるこずが知られおいたす。 このために、 nameru 、 nameenたたはnameesなどの特別なタグが䜿甚されたす。最も重芁なのは、 OpenStreetMap参加者によっお埋められたす。 もちろん、最も詳现な碑文は、ナヌザヌが話す蚀語で䜜成されたすロシア語-ロシア語、䞭囜-䞭囜語、アフリカ諞囜-珟地語。 ナむゞェリアの䞀郚の道路でロシア語の翻蚳が行われる可胜性はほずんどありたせんが、それでも䞻芁な地理オブゞェクト囜、郜垂、河川などには翻蚳がありたす。 この小さな地図情報は、ロシア語を話すナヌザヌが、たずえば䞭囜の地図を開いお、その䞊の䞻芁な名前を芋぀けるのに十分です。 したがっお、リ゜ヌスはもう少しナヌザヌフレンドリヌになりたす。

独自のWebカヌドでこれらの翻蚳タグを䜿甚する方法に関する賢明な指瀺を芋぀けるこずを目指しおいる堎合、Runetのスペヌス党䜓たたはむンタヌネットでさえ、 OpenStreetMap Webマップのロヌカリれヌションのさたざたな偎面に関する情報のみが散圚しおいたすが、「箱入り」の指瀺はほずんど芋぀かりたせん。 䞀方で、この問題は最も難しいアヌキテクチャ䞊の問題ではありたせん。なぜなら、 このテクノロゞヌは、 OpenStreetMapプロゞェクト自䜓の䞀郚ずしお開発されたした。 しかし䞀方で、有名なRostelecom SatelliteなどのロヌカラむズされたWebマップの完成したプロゞェクトでは、ロヌカリれヌションの問題は解決され、開発者が盎面した問題ずそれらの解決方法はITコミュニティによっお話されおいたせん。



倚蚀語サポヌトを備えたWebマップのデザむンもありたすが、それらは論理的で䜿いやすいものではありたせん。



この蚘事の目的は、この異皮の情報を、 OpenStreetMapマップをロヌカラむズするための完党な指瀺の圢でたずめるこずです。 この蚘事では、 OpenStreetMapデヌタに基づいお北にタむルを展開するこずに関する最小限の情報を、 Habré 、 Gis-Lab'e 、および他の特別なプロゞェクトの他の出版物は、このトピックを詳现に明らかにしおいたす。 この蚘事のフレヌムワヌクでは、 よく知られおいる指瀺に埓っお、タむルのリポゞトリWebマップむメヌゞが「ステッチ」されるむメヌゞタむルをデプロむしたすが、詳现な説明は行いたせん。 タむルストレヌゞの展開に関する質問がある堎合は、最初に蚘茉されおいる手順をご芧ください。

したがっお、パッケヌゞが必芁です必芁なすべおの䟝存関係を含む

この蚘事の目的のために、本栌的なタむルサヌバヌApache httpd、mod_tile、およびレンダリング枈みをデプロむする必芁はありたせん。 ただし、タむルサヌバヌの展開の方向ベクトルは以䞋のずおりです。詳现な手順に぀いおは、䞊蚘のリンクを参照しおください。

1. OpenStreetMapからベクタヌデヌタを取埗する


このデヌタをosm2pgsqlナヌティリティを䜿甚しおPostgresqlデヌタベヌスにむンポヌトするず、Mapnikレンダリングパッケヌゞがラスタヌタむルを生成したす。

そのため、 OpenStreetMapミラヌの1぀から、XML圢匏OSMファむルたたは圧瞮バむナリPBF圢匏で指定された領域のマップをダりンロヌドしたす。
planetファむルは、次のコマンドでダりンロヌドできたす。

wget http://download.bbbike.org/osm/planet/planet-latest.osm.pbf.md5 wget http://download.bbbike.org/osm/planet/planet-latest.osm.pbf md5sum planet-latest.osm.pbf 

このデヌタは重芁であるこずに泚意しおください。 たずえば、惑星Planet.osm党䜓の非圧瞮OSM XML圢匏のベクタヌデヌタを含むファむルは1TB以䞊、XML圢匏では圧瞮bz2、41.8GB、バむナリPBF圢匏18.1GBを䜿甚したす。 これらの圢匏はすべお同じデヌタを保存したす。 圓然、惑星党䜓ではなく特定の地域のみが必芁な堎合、これらの数倀ははるかに小さくなりたすが、フォヌマット、OSM XML、OSM XML、圧瞮bz2、およびPBFフォヌマットのデヌタボリュヌムの割合は倉わりたせん。 Postgresqlにむンポヌトする前に、BZ2およびバむナリ圢匏PBFで圧瞮されたOSM XML圢匏のベクタヌデヌタが前凊理アンパック、解析されるため、ダりンロヌドしたファむルをPostgresqlデヌタベヌスにむンポヌトする時間が長くなるこずに泚意しおください。 そのため、16GBのRAM、2TBのHDDUbuntu 14.04 64xを搭茉したクアッドコアCore i5マシンでは、 Planet.osm.pbfのむンポヌトに2週間かかりたした。 同様のPlanet.osm.bz2ファむルのむンポヌトには、1桁の時間がかかりたせんでした。 私の考えでは、osm2pgsqlナヌティリティはRAMの量を芁求しおいたす最適なメモリ管理のため、osm2pgsqlナヌティリティの--cacheおよび--cache-strategyキヌの機胜に぀いお読んでください、プロセッサコアの頻床ず数ファむルの解析時、プロセッサコアのロヌドを制埡するために参照しおください osm2pgsqlナヌティリティの--number-processesキヌ、およびハヌドドラむブの速床Postgresqlでのデヌタの挿入時およびむンデックスの䜜成時、最適化に぀いおは、osm2pgsqlナヌティリティの--disable-parallel-indexingキヌを参照しおください。 SSDがある堎合、Postgresqlデヌタベヌスぞのデヌタのむンポヌトははるかに高速になりたす。

この蚘事では、䞭囜の地域を次のように䜿甚したす。 デフォルトではRussifiedではなく、サむズが比范的小さいので、デバッグ技術の段階で䟿利です。 䞭囜のベクタヌデヌタファむルは、 geofabrik.deプロゞェクトのWebサむトから次のコマンドを䜿甚しおダりンロヌドできたす。

 wget http://download.geofabrik.de/asia/china-latest.osm.pbf 

2.受信したベクタヌデヌタOpenStreetMapを曎新したす


実際、デヌタファむルがパッケヌゞ化されおからマシンに展開されるたでの間に、OpenStreetMapでいく぀かの倉曎が行われる可胜性がありたす。 したがっお、むンポヌトする前に、osmcutilsパッケヌゞのosmupdateコマンドでデヌタファむルを曎新したす。

 osmupdate china-latest.osm.pbf new-china-latest.osm.pbf 

OSMファむルにタむムスタンプが含たれおいない堎合、osmupdateナヌティリティぱラヌを返したす。 この堎合ファむルのタむムスタンプがわかっおいる堎合-ファむルのダりンロヌドペヌゞで公開される堎合がありたす、次の圢匏でコマンドを実行する必芁がありたす。

 osmupdate china-latest.osm.pbf 2015-05-13T14:48:07Z new-china-latest.osm.pbf 

osmupdateナヌティリティは、diffファむルを個別にダりンロヌドし、callコマンドの最初の匕数で指定されたファむルに適甚したす。 OSM XML圢匏の倧きなファむルplanet-latest.osm.bz2などでosmupdateナヌティリティを実行するこずはお勧めしたせん。 同じosmcutilsパッケヌゞのosmconvertナヌティリティによるファむルの予備凊理が必芁です。osmupdateナヌティリティは、倉換埌のファむルで数日間機胜したす。 倧きなファむルの堎合は、PBF圢匏を䜿甚するこずをお勧めしたす。 ただし、このようなファむルをPostgresqlにむンポヌトする堎合は、OSM XMLファむルをむンポヌトするよりも時間がかかるこずに泚意しおください。 いわば、䞡刃の剣。 個人的に、私は垞にPBF圢匏を遞択したす。

3. osm2pgsqlナヌティリティの蚭定で必芁な蚀語のサポヌトを構成したす


デフォルトでは、すべおの蚀語のサポヌトは/usr/share/osm2pgsql/osm2pgsql/default.styleスタむルシヌトにむンストヌルされおいたせん。 マップ䞊の碑文には、次の行で/usr/share/osm2pgsql/osm2pgsql/default.styleファむルに蚭定されおいる名前タグが䜿甚されたす。

 node,way name text linear 

たずえば、ロシア語、英語、スペむン語をサポヌト埌に远加したす。

 node,way name:ru text linear node,way name:en text linear node,way name:es text linear 

これらの3行は、osm2pgsqlナヌティリティに、PBFファむルからタグ倀nameru 、 nameen 、 nameseもむンポヌトするように指瀺したす。 他のロヌカラむズされた名前は無芖されたす。

4. OpenStreetMapベクタヌデヌタを保存するPostgresqlデヌタベヌスを䜜成したす


最初に、信頌認蚌を構成しパスワヌドを入力しないため、この蚘事のフレヌムワヌク内でこれは必芁ありたせん、必芁なデヌタベヌスナヌザヌを䜜成する必芁がありたす 手順を参照。 この蚘事の䞀郚ずしお、認蚌ず暙準のpostgresナヌザヌを信頌するように制限しおいたす。 そのため、たずえばchinaなどのデヌタベヌスを䜜成し、必芁な拡匵機胜を接続したす。

 createdb -U postgres china psql -U postgres -d china -c 'CREATE EXTENSION hstore; CREATE EXTENSION postgis;' 

5.ベクタヌデヌタをPostgresqlデヌタベヌスにむンポヌトする


むンポヌトはosm2pgsqlナヌティリティによっお実行されたす。 ナヌティリティキヌの説明は、ナヌティリティのヘルプに蚘茉されおいたす。 いく぀かの説明情報が英語のリ゜ヌスで提䟛されおいたす。

 osm2pgsql -s -m -d china -U postgres --drop new-china-latest.osm.pbf 

--dropスむッチを䜿甚するず、デヌタベヌスが占有するディスク容量を枛らすこずができるため、新しいPBFたたはOSM XMLファむルからデヌタベヌス内のデヌタを埌で曎新する機胜が犠牲になりたす。 䞭囜の堎合、デヌタベヌスのサむズは玄500MBから92MBに枛少したした。 デヌタベヌスが占めるサむズを確認するには、既存のデヌタベヌスに接続されたpsqlコン゜ヌルで次のコマンドを入力したす。

 SELECT pg_size_pretty( pg_database_size( 'china' ) ); 

6.翻蚳された地理名を衚瀺するために、DBに衚珟を䜜成したす。


呜什を䜿甚しお、SQLのいく぀かの衚珟を䜜成したす。 「ロシア語」タむルロシアの眲名を含むタむルを生成するには、接頭蟞china_ruを䜿甚しお、「英語」タむル-china_enを生成し、「スペむン語」タむル-china_esを生成したす。 以䞋は、「ロシア語」タむルのみを生成するためのSQL衚珟を䜜成するためのSQLスクリプトです。 芪愛なる読者は、 "ロシア語" VIEWを基瀎ずしお、 "英語"および "スペむン語"タむルの生成に関するSQLビュヌを理解しおいるず思いたす。

 CREATE VIEW china_ru_point AS SELECT data.osm_id, data.access, data."addr:housename", data."addr:housenumber", data."addr:interpolation", data.admin_level, data.aerialway, data.aeroway, data.amenity, data.area, data.barrier, data.bicycle, data.brand, data.bridge, data.boundary, data.building, data.capital, data.construction, data.covered, data.culvert, data.cutting, data.denomination, data.disused, data.ele, data.embankment, data.foot, data."generator:source", data.harbour, data.highway, data.historic, data.horse, data.intermittent, data.junction, data.landuse, data.layer, data.leisure, data.lock, data.man_made, data.military, data.motorcar, CASE data."name:ru" IS NULL WHEN true THEN '' ELSE data."name:ru" || CASE data.name IS NULL WHEN true THEN '' ELSE E'\n' END END || CASE data.name IS NULL WHEN true THEN '' ELSE data.name END AS name, data."natural", data.office, data.oneway, data.operator, data.place, data.poi, data.population, data.power, data.power_source, data.public_transport, data.railway, data.ref, data.religion, data.route, data.service, data.shop, data.sport, data.surface, data.toll, data.tourism, data."tower:type", data.tunnel, data.water, data.waterway, data.wetland, data.width, data.wood, data.z_order, data.way FROM planet_osm_point AS data; CREATE VIEW china_ru_line AS SELECT data.osm_id, data.access, data."addr:housename", data."addr:housenumber", data."addr:interpolation", data.admin_level, data.aerialway, data.aeroway, data.amenity, data.area, data.barrier, data.bicycle, data.brand, data.bridge, data.boundary, data.building, data.construction, data.covered, data.culvert, data.cutting, data.denomination, data.disused, data.embankment, data.foot, data."generator:source", data.harbour, data.highway, data.historic, data.horse, data.intermittent, data.junction, data.landuse, data.layer, data.leisure, data.lock, data.man_made, data.military, data.motorcar, CASE data."name:ru" IS NULL WHEN true THEN '' ELSE data."name:ru" || CASE data.name IS NULL WHEN true THEN '' ELSE E'\n' END END || CASE data.name IS NULL WHEN true THEN '' ELSE data.name END AS name, data."natural", data.office, data.oneway, data.operator, data.place, data.population, data.power, data.power_source, data.public_transport, data.railway, data.ref, data.religion, data.route, data.service, data.shop, data.sport, data.surface, data.toll, data.tourism, data."tower:type", data.tracktype, data.tunnel, data.water, data.waterway, data.wetland, data.width, data.wood, data.z_order, data.way FROM planet_osm_line AS data; CREATE VIEW china_ru_polygon AS SELECT data.osm_id, data.access, data."addr:housename", data."addr:housenumber", data."addr:interpolation", data.admin_level, data.aerialway, data.aeroway, data.amenity, data.area, data.barrier, data.bicycle, data.brand, data.bridge, data.boundary, data.building, data.construction, data.covered, data.culvert, data.cutting, data.denomination, data.disused, data.embankment, data.foot, data."generator:source", data.harbour, data.highway, data.historic, data.horse, data.intermittent, data.junction, data.landuse, data.layer, data.leisure, data.lock, data.man_made, data.military, data.motorcar, CASE data."name:ru" IS NULL WHEN true THEN '' ELSE data."name:ru" || CASE data.name IS NULL WHEN true THEN '' ELSE E'\n' END END || CASE data.name IS NULL WHEN true THEN '' ELSE data.name END AS name, data."natural", data.office, data.oneway, data.operator, data.place, data.population, data.power, data.power_source, data.public_transport, data.railway, data.ref, data.religion, data.route, data.service, data.shop, data.sport, data.surface, data.toll, data.tourism, data."tower:type", data.tunnel, data.water, data.waterway, data.wetland, data.width, data.wood, data.z_order, data.way, data.way_area FROM planet_osm_polygon AS data; CREATE VIEW china_ru_roads AS SELECT data.osm_id, data.access, data."addr:housename", data."addr:housenumber", data."addr:interpolation", data.admin_level, data.aerialway, data.aeroway, data.amenity, data.area, data.barrier, data.bicycle, data.brand, data.bridge, data.boundary, data.building, data.construction, data.covered, data.culvert, data.cutting, data.denomination, data.disused, data.embankment, data.foot, data."generator:source", data.harbour, data.highway, data.historic, data.horse, data.intermittent, data.junction, data.landuse, data.layer, data.leisure, data.lock, data.man_made, data.military, data.motorcar, CASE data."name:ru" IS NULL WHEN true THEN '' ELSE data."name:ru" || CASE data.name IS NULL WHEN true THEN '' ELSE E'\n' END END || CASE data.name IS NULL WHEN true THEN '' ELSE data.name END AS name, data."natural", data.office, data.oneway, data.operator, data.place, data.population, data.power, data.power_source, data.public_transport, data.railway, data.ref, data.religion, data.route, data.service, data.shop, data.sport, data.surface, data.toll, data.tourism, data."tower:type", data.tunnel, data.water, data.waterway, data.wetland, data.width, data.wood, data.z_order, data.way FROM planet_osm_roads AS data; INSERT INTO geometry_columns VALUES ('', 'public', 'china_ru_point', 'way', 2, 900913, 'POINT'); INSERT INTO geometry_columns VALUES ('', 'public', 'china_ru_line', 'way', 2, 900913, 'LINESTRING'); INSERT INTO geometry_columns VALUES ('', 'public', 'china_ru_polygon', 'way', 2, 900913, 'POLYGON'); INSERT INTO geometry_columns VALUES ('', 'public', 'china_ru_roads', 'way', 2, 900913, 'LINESTRING'); 

この堎合、「nameru \ nname」ずいう圢匏で眲名をカヌドに䜜成したす。E '\ n'は、ご存じのように、キャリッゞを新しい行に移動するための蚘号です。 マップ䞊の眲名のより掗緎された配眮に぀いおは、 TextSymbolizer Mapnikのドキュメントを参照しおください。 この堎合、次の段萜のこの指瀺に埓っお生成された、マップ䞊の眲名の衚瀺スタむルを倉曎する必芁がありたす。

7. OpenStreetMapからスクリプトをむンストヌルしおタむルを生成したす


ディレクトリ/ home / osm / mapnikを遞択しお、必芁なMapnikスクリプトをすべお保存したしょう。 OpenStreetMapからスクリプトをポンプしおタむルを生成し、小さなスケヌルでのタむルの生成を簡玠化するために䜿甚される䞖界の圢状シェむプファむルを抜出し、MapnikスタむルのXMLファむルを䜜成しおデヌタベヌスにアタッチしたす。

 svn co http://svn.openstreetmap.org/applications/rendering/mapnik /home/osm/mapnik /home/osm/mapnik/get-coastlines.sh 

次に、地理オブゞェクトのロシア語、英語、スペむン語の眲名甚に、それぞれタむルをレンダリングするための3぀のファむルスタむルを䜜成する必芁がありたす。 これを行うには、特別な環境倉数MAPNIK_PREFIXを蚭定したす。これにより、Postgresデヌタベヌス内のベクタヌデヌタテヌブルのプレフィックスを蚭定でき、スクリプト/home/osm/mapnik/generate_xml.pyが読み取り、デヌタベヌスぞの擬䌌ク゚リに眮き換えたす。

 export MAPNIK_PREFIX='china_ru' /home/osm/mapnik/generate_xml.py /home/osm/mapnik/osm.xml china_ru.xml --dbname china --user postgres --accept-none export MAPNIK_PREFIX='china_en' /home/osm/mapnik/generate_xml.py /home/osm/mapnik/osm.xml china_en.xml --dbname china --user postgres --accept-none export MAPNIK_PREFIX='china_es' /home/osm/mapnik/generate_xml.py /home/osm/mapnik/osm.xml china_es.xml --dbname china --user postgres --accept-none 

これらのコマンドは、タむルをレンダリングするための3぀の特別なスタむルを䜜成し、ロシア語、英語、スペむン語の必芁な衚珟からレンダリング甚のデヌタを読み取るこずができたす。

8.タむル生成スクリプトでは、タむル生成のための䞭囜の領域を瀺したす


スクリプト/home/osm/mapnik/generate_tiles_multiprocess.pyには次の行がありたす。

 bbox = (-180.0,-90.0, 180.0,90.0) #          render_tiles(bbox, mapfile, tile_dir, 0, 5, "World") #     0-  5-  

これらの行の埌、次のように蚘述したす。

 bbox = (85.0,19.7,132.5,40.8) #       render_tiles(bbox, mapfile, tile_dir, 6, 15, "China") #     6-  15-  exit() 

これにより、必芁な蚀語の眲名を含む6〜15スケヌルの䞭囜のタむルが生成されたす。 exit呜什を䜿甚するず、スクリプト/home/osm/mapnik/generate_tiles_multiprocess.pyMuenchen、Muenchen +、Muenchen ++、Nuernberg、Karlsruhe、Karlsruhe +、Augsburg、Augsburg +、Europe +でデフォルトで指定された領域のさらなるレンダリングを拒吊できたす。 たた、単䞀のスレッドでレンダリングプロセスを開始するスクリプト/home/osm/mapnik/generate_tiles.pyもありたす。 ただし、䜿甚したせん。 耇数のプロセッサコアがある堎合、スクリプト/home/osm/mapnik/generate_tiles_multiprocess.pyは䞀般に高速に動䜜したす。

9.遞択した堎所のタむルを生成したす


Mapnikが生成されたタむルを保存するディレクトリを䜜成する必芁がありたす。

 mkdir /home/osm/mapnik/tiles mkdir /home/osm/mapnik/tiles/ru mkdir /home/osm/mapnik/tiles/en mkdir /home/osm/mapnik/tiles/es 

システム環境MAPNIK_MAP_FILEおよびMAPNIK_TILE_DIRの倉数の倀を倉曎しお、タむルの生成を3回開始する必芁がありたす。 スクリプトはこれらの倉数を読み取り、Mapnikに枡しおタむルのレンダリングを構成したす。

 export MAPNIK_MAP_FILE=/home/osm/mapnik/china_ru.xml export MAPNIK_TILE_DIR=/home/osm/mapnik/tiles/ru/ exec python /home/osm/mapnik/generate_tiles_multiprocess.py export MAPNIK_MAP_FILE=/home/osm/mapnik/china_en.xml export MAPNIK_TILE_DIR=/home/osm/mapnik/tiles/en/ exec python /home/osm/mapnik/generate_tiles_multiprocess.py export MAPNIK_MAP_FILE=/home/osm/mapnik/china_es.xml export MAPNIK_TILE_DIR=/home/osm/mapnik/tiles/es/ exec python /home/osm/mapnik/generate_tiles_multiprocess.py 

タむルが生成されたす。

10. Webマップにタむルを衚瀺する


これを行うには、䜜成したタむルリポゞトリを接続する最も単玔なhtmlペヌゞを䜜成したす。 ペヌゞファむルは、生成されたタむル/ home / osm / mapnik / tilesのディレクトリの隣に配眮する必芁がありたす。 Webマップを衚瀺するには、 LeafletJS javascriptフレヌムワヌクを䜿甚したす。

 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css" /> <script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script> </head> <body> <div id="map" style="height: calc(100vh - 15px)"></div> <script> var map = L.map('map', { center: [34.7, 111.7], zoom: 6 }); L.control.layers({ "ru" : L.tileLayer('tiles/ru/{z}/{x}/{y}.png').addTo(map), "en" : L.tileLayer('tiles/en/{z}/{x}/{y}.png'), "es" : L.tileLayer('tiles/es/{z}/{x}/{y}.png') }, null).addTo(map); </script> </body> </html> 

このペヌゞはロヌカルで実行されたす。 右䞊隅に、タむルの゜ヌスを遞択できるコントロヌルが䜿甚可胜になっおいるはずです。 マップのロシア語版、英語版、スペむン語版は次のようになりたす。





11.「オンザフラむ」でのタむルのレンダリング


Apache Webサヌバヌのいく぀かのmod_tileモゞュヌルを構成する必芁がありたす。各モゞュヌルは、独自のマッピングを担圓したす-/ ru-ロシアのタむルをレンダリングする/ en-それぞれ、英語のタむルをレンダリングするなど mod_tile、httpd、およびrenderdの構成の詳现に぀いおは、 Gis-Labの手順を参照しおください。 マップのロヌカラむズの䟋のデモンストレヌションの䞀環ずしお、OpenStreetMapは本栌的なタむルサヌバヌを展開する必芁があるずは考えおいたせん。

泚釈



結論


OpenStreetMapマップのロヌカラむズの問題はそれほど難しくありたせん。 この問題を解決するには、いく぀かのアプロヌチがありたす。 この蚘事では、非垞に具䜓的な䜜業オプションを提案したす。 芪愛なる読者は、この蚘事の内容に぀いお倚くの質問を持っおいるず確信しおいたす。提案されたアルゎリズムを分岐させるための圌自身のアむデアがあるでしょう。 この蚘事の著者は、OpenStreetMapマップのRussification / localizationの問題を解決する唯䞀の真の方法であるずは䞻匵しおおらず、この問題を解決する際の「トリック」に぀いお喜んでお読みください。

Source: https://habr.com/ru/post/J259141/


All Articles