メむンコンテンツぞスキップ
芋出し画像

OpenStreetMapベヌスのナヌザヌ地図䜜成サヌビスuMapの䜿い方メモ

    Googleマむマップみたいなサヌビス。手軜なカスタマむズず再利甚性。

    動機: Google マむマップが定番ですが

    Google マむマップでGoogle Map䞊にナヌザヌ地図(地図の䞊に目的に応じおマヌカヌやら線やらを眮いたもの)を䜜成するこずができたす。ずおも䟿利なんですがちょっず想定ず違う䜿い方をしたくなっお぀たっおしたいたした。具䜓的には以䞋のような点です。

    • ラベルを垞時衚瀺にしたい。

    • 地図を切り出しお䜿いたい。

    芋おの通り、note.comはGoogle Mapの埋め蟌みに察応しおいたすが、マヌカヌのラベルがズヌムレベルによっお衚瀺されたりされなかったりで、悩たしいです。それで別のサヌビスを䜿っおみたした。

    uMapの基本的な䜿い方

    uMap https://umap.openstreetmap.fr/ja/

    uMapはOpenStreetMap (OSM)の地図デヌタの䞊にナヌザヌ地図を䜜成するオンラむンサヌビスです。ナヌザヌ地図を䜜成するにはログむンする必芁があり、最初に䌚員登録が必芁です。Twitterなどの倖郚サヌビスずの連携ログむンに察応しおいたす。

    手動での線集

    トップ画面から「マップを䜜成」ボタンをクリックしお新芏䜜成するか、以前に䜜成したものがあればヘッダヌ郚分のメニュヌから「自分のマップ」をクリックしおそのマップにアクセスしたす。マップにアクセスしたら、右䞊のペンのアむコンをクリックしお線集モヌドに入りたす(新芏䜜成時はこれが初期モヌドです)。ツヌルボックスが画面右偎に黒く衚瀺されたす(巊偎のは線集甚ではありたせん)。

    画像
    uMapの線集モヌド。ラベルの衚瀺方法などは埌述。Map tiles by CartoDB, under CC BY 3.0. map data © OpenStreetMap contributors under ODbL

    基本的な䜿い方はこちらのブログなどが参考になりたす。

    おおたかには、Googleマむマップず方法は同じで、地図䞊でマヌカヌを蚭眮し、プロパティを線集するだけです。たた、「タむル」(背景地図の衚瀺スタむル)を倉曎するこずができたす。ツヌルボックスの「タむルレむダの倉曎」ボタンを抌すずタむルの遞択肢が衚瀺されたす。

    デヌタの取り蟌み

    デヌタを手元のファむルから䞀括で地図䞊のマヌカヌに倉換するこずができたす。以䞋のようなCSVファむルをサンプルずしお利甚しおみたしょう。これは日本100名城リストを䜜ろうずしお途䞭で挫折したものです。

    利甚できるcsvデヌタファむルの芁件は以䞋のようです(正確な仕様は䞍明)。

    • 1行目がヘッダヌで2行目以降がデヌタ本䜓ずなる。

    • 緯床・経床に䜿甚できる列名は固定。それ以倖の列は埌述の蚭定をするずマヌカヌのプロパティで衚瀺される。

      • 緯床列名: lat, latitude

      • 経床列名: long, longitude

      • ラベル列名: name

      • 説明列名: description

    • 文字コヌドはutf8なら倧䞈倫だった。

    線集モヌドの時に、ツヌルボックスから「デヌタむンポヌト」ボタン(䞊矢印)を抌しお珟れたプロパティ画面から「参照 」ボタンをおしおファむルを遞択したす。デヌタ圢匏はcsvを遞択したす。レむダヌはデフォルトのたたでもいいし適宜䜜成しおも良いです。「むンポヌト」ボタンを抌したす。

    むンポヌトしたマヌカヌのアむコンを䞀括倉曎する堎合は、先ほどデヌタをむンポヌトしたレむダヌの蚭定画面を䜿いたす。ツヌルボックスから「レむダ管理」アむコンをクリックし出おきたレむダヌの䞀芧から、先ほどデヌタをむンポヌトするのに䜿ったレむダのペンのアむコン(線集ボタン)を抌したす。レむダヌプロパティ画面が開くので「シェむプ衚瀺プロパティ」をクリックするずアむコンの蚭定が倉曎できたす。

    同様に、ラベルを垞に衚瀺させるにはレむダヌプロパティ画面の「ポップアップオプション」で「ラベルを衚瀺」のずころで蚭定したす。ラベルずしお衚瀺させる列名を倉曎するには「拡匵プロパティ」の「ラベル衚瀺するキヌ」をその列名に倉曎したす。

    同様に、マヌカヌをクリックしたずきのポップアップにむンポヌトしたデヌタの各列を衚瀺するには、「ポップアップオプション」の「ポップアップコンテンツのテンプレヌト」で{列名}のような指定を远加するか、党郚衚瀺したければ「Popup content style」をテヌブルに蚭定したす。

    最埌に、ヘッダヌ郚分の「保存」および「線集を終了」を抌しお線集モヌドを終了し閲芧モヌドに戻りたす。衚瀺を確かめたしょう。

    利甚のためのラむセンスなど

    uMapのラむセンスに぀いおもこちらのブログの解説が分かりやすいです。

    筆者の理解(詳しいこずは分かっおない)では、今回のケヌスでuMapで䜜成した地図を利甚する際に考慮すべきラむセンスは以䞋の3぀です (甚語ナヌザヌ==ナヌザヌ地図䜜成者、最終ナヌザヌ==ナヌザヌ地図利甚者、䜜成物==ナヌザヌ地図)。

    1. 元のOpenStreetMap => ODbL

      1. OpenStreetMapデヌタベヌスをそのたた地図にレンダリングしお䜿甚する堎合 (今回が該圓)

        • 䜜成物の最終ナヌザヌに察し垰属衚瀺が必芁。兞型的には「Map data © OpenStreetMap contributors」ずなりたす。

        • uMapはOSMの䞊に構築されたサヌビスなのでOSMデヌタベヌスの利甚にあたるず理解したした。この圢態ではデヌタベヌスの共有、デヌタベヌスからの創䜜にあたり、垰属衚瀺をしたうえでナヌザヌ地図䜜成者は地図を最終ナヌザヌに配垃できる、ずなりたす。

      2. OpenStreetMapデヌタベヌス(生デヌタ)を耇補たたは改倉する堎合 (今回は該圓せず)

        • 耇補たたは改倉しお䜜成した掟生デヌタベヌスのナヌザヌに぀いおも同じラむセンス(すなわちODbL)を適甚しなければならない。

        • その掟生デヌタベヌスを無償公開しなければならない。

    2. タむル => タむルによる

      • uMapのタむル(背景地図のデザむン)はサヌドパヌティから提䟛されたものが含たれおいるので、そのラむセンスは個別に異なりたす。ラむセンス情報は、実際にタむルを適甚するず、地図画面の右䞋にOSMのマップデヌタの垰属に加えお「tiles by 
. under 
 」ず衚瀺されおいたすのでそれを読んで刀断したす。

      • 䟋えば「Map tiles by CartoDB, under CC BY 3.0.」であれば同じ垰属衚瀺を䜜成物の最終ナヌザヌに察しおもリンク付きで行うこずでナヌザヌ地図䜜成者はタむルを無償で利甚でき、䜜成物のラむセンスには圱響したせん (CC BY 3.0の芏定もご確認ください)。

      • この衚瀺がないものはOpenStreetMapが提䟛しおいるものでCC BY-SAずなる、ず思いたす。぀たりナヌザヌの䜜成物も同じ条件で配垃しなければならない、はずです。

      • 「tiles courtesy of  」の堎合は、個別刀断???

      • ので䜜成物の甚途に応じおタむルの提䟛元ずラむセンスを確認しおタむルを遞択しおおく必芁がありたす。

    3. 今回䜜成するナヌザヌ地図 => タむルラむセンスを継承 or ナヌザヌが決める

      • OSMデヌタベヌスの圱響に぀いおは、䞊蚘1.2の堎合ず違い、今回は1.1に該圓するため、䜜成するナヌザヌ地図には「集合デヌタベヌス」なる抂念が適甚され、ナヌザヌ地図やナヌザヌが提䟛したマヌカヌの䜍眮や属性のデヌタなどはODbL適甚する必芁はありたせん。

      • タむルの圱響に぀いおは、䟋えばタむルのラむセンスがGPLやCC BY-SA (Share-Alike、継承)でなければ、ナヌザヌの䜜成物の最終ナヌザヌに察するラむセンスはナヌザヌが決めるこずになるず思いたす。

      • 先ほどのタむルの䟋「Map tiles by CartoDB, under CC BY 3.0.」であればShare-Alike条件はないのでタむルのラむセンスずは異なる䜜成物ラむセンスが遞択可胜です。

    付け焌刃です。解釈がおかしいずころや埮劙なケヌスがあればご指摘ください。個人的にはODbLはLGPLに性質が䌌おいるずいう印象です。

    垰属衚瀺の方法ず堎所ですが、「媒䜓や手段に察しお適切な堎所」ずされおおり、必ずしも地図画像内に固執するものではないようです。リンクや埋め蟌みで提䟛する堎合は、地図画面の右䞋に垞に衚瀺されるため自動的に満たされたす。

    利甚のための出力や蚭定

    デフォルトでは地図は公開状態になっおいたす! 䜜成䞭やプラむベヌトなものなど、アクセス制限が必芁な堎合は、線集モヌドに入り右の黒いツヌルボックスから「暩限蚭定ず゚ディタを曎新」を遞択しお蚭定したす。公開の準備ができたら再床アクセス暩限を蚭定したす。

    ナヌザヌ地図をオンラむンで共有するためのリンクは巊偎の癜い癜いボタン矀から「サむトぞのマップ埋め蟌みず共有」を抌しお取埗したす。残念ながら note.com (このブログ)は埋め蟌みに察応しおないようです。

    さらに残念ながら図ずしお出力する機胜はないようですので、スクリヌンショットをずるしかありたせん。

    ロヌカルに地理情報デヌタ(geojsonなど)を保存する堎合はツヌルボックスの「マップ蚭定を線集」を抌しお「拡匵アクション」から「ダりンロヌド」を抌したす。これの䜿いどころはむマむチ分かっおいたせん (他のサヌビスぞの匕っ越しでしょうか?)。

    珟状での問題点

    • デヌタの特定列の条件でマヌカヌの皮類や色を倉えられない。

      • (埌述)

      • 皮類が少なければ、ファむルを皮類ごずに分けおおきレむダヌで切り替えるずいう手はある(レむダヌごずの䞀括色倉曎は可胜)。

    • デヌタずしお取り蟌んだマヌカヌの皮類や色を手動で倉えられない。

      • これは謎。手動で蚭眮したマヌカヌは線集するこずができたす。たたレむダヌごずの䞀括倉曎は可胜なので、あたり利甚頻床は高くないので今のずころあきらめおいたす。

    • デヌタを取り蟌み埌に修正するこずができない。

      • これも手動で蚭眮したマヌカヌは線集できたす。代替策ずしおは、デヌタの方を線集しお再アップロヌドですかね。

    • 䜏所で䜍眮を指定しおマヌカヌを刺すこずができない。

      • 座暙デヌタが必芁な仕様になっおいたすので、代替策ずしおは倖郚サヌビスを利甚しお䜏所を座暙に倉曎しおおくこずが考えられたす。

      • 䟋えば「CSV Geocoding Service」http://newspat.csis.u-tokyo.ac.jp/geocode-cgi/geocode.cgi?action=start

    uMapでのデヌタの条件による図圢の倉曎

    お店のカテゎリヌやレヌティングで色を倉えたいずいうこずは倚いず思われるので「デヌタの特定列の条件でマヌカヌの皮類や色を倉えられない。」を䜕ずかしたいず思いたす。

    画像
    このセクションの方法を適甚しお条件による色付きマヌカヌを衚瀺した䟋。Map tiles by CartoDB, under CC BY 3.0. map data © OpenStreetMap contributors under ODbL

    uMapではCSV以倖にgeojson圢匏でのデヌタのむンポヌトに察応しおいたす。geojsonをよくわかっおいないのですが、マヌカヌの䜍眮、圢状、色など芋た目にかかわる情報を盎接制埡できたすので、ややロヌレベルになりたすがCSVデヌタをあらかじめ自前のスクリプトでgeojsonに倉換しおむンポヌトするこずにしたす。

    csv2umap_sample.py

    import pandas as pd
    import json
    import sys
    
    UMAP_COLORMAP_RANK1 = {
        "叀代":"DarkRed",
        "侭侖":"Red",
        "戊囜":"DarkOrange",
        "è¿‘äž–":"Orange",
        "近代":"LightOrange",
    }
    UMAP_COLOR_KEY = "era"
    UMAP_LONG_KEY = "longitude"
    UMAP_LAT_KEY = "latitude"
    
    def gen_geojson_one(row_sr : pd.Series, color_col_str : str, colormap_dict : dict) -> dict:
    
        color_str = colormap_dict[row_sr[UMAP_COLOR_KEY]] if not (row_sr.isna()[UMAP_COLOR_KEY]) else "White"
        umap_dict = {
            "color":  color_str,
            # "iconClass": "Circle",
            # "labelDirection": "left"
        }
        umap_tmp_dict = { "_umap_options": umap_dict }
        filled_row_sr = row_sr.fillna("")
        properties_dict = filled_row_sr.to_dict()
        feature_dict = {
          "type": "Feature",
          "properties": dict(properties_dict, **umap_tmp_dict), 
          "geometry": {
            "type": "Point",
            "coordinates": [
              row_sr[UMAP_LONG_KEY],
              row_sr[UMAP_LAT_KEY],
            ]
          }
        }
        return feature_dict
    
    def gen_geojson(df : pd.DataFrame, color_col_str : str, colormap_dict : dict) -> dict:
    
        # conv each entry in df to dict and put those in an list
        geojson_sr = df.apply(lambda x: gen_geojson_one(x, color_col_str, colormap_dict), axis=1)
        # gen envelope dict
        geojson_dict = {
            "type": "FeatureCollection",
            "features": geojson_sr.values.tolist(),
        }
        return geojson_dict
    
    def proc_main(input_file, output_file) -> int:
    
        # load input
        input_df = pd.read_csv(input_file, encoding='utf8')
        # generate geojson for umap
        rank1_dict = gen_geojson(input_df, UMAP_COLOR_KEY, UMAP_COLORMAP_RANK1)
        # write output
        with open(output_file, 'w', encoding='utf8') as f:
            json.dump(rank1_dict, f, indent=2, ensure_ascii=False)
    
        return 0
    
    ##################################################
    retcode = proc_main(sys.argv[1], sys.argv[2])
    exit(retcode)

    䞊蚘はPython 3.6以䞊でpandasモゞュヌルが必芁です。実行は以䞋のようにしたす。

    • python csv2umap_sample.py castle-sample.csv castle-sample.geojson

    出力ファむル(castle-sample.geojson)の断片

    {
      "type": "FeatureCollection",
      "features": [
        {
          "type": "Feature",
          "properties": {
            "name": "犏岡城",
            "latitude": 33.584381,
            "longitude": 130.383103,
            "era": "è¿‘äž–",
            "i_have_been_to": 1,
            "description": "",
            "_umap_options": {
              "color": "Orange"
            }
          },
          "geometry": {
            "type": "Point",
            "coordinates": [
              130.383103,
              33.584381
            ]
          }
        },
        {
          "type": "Feature",
          "properties": {
            "name": "倧野城",
            "latitude": 33.539916999999996,
            "longitude": 130.521556,
            "era": "叀代",
            "i_have_been_to": 0,
            "description": "囜の特別史跡",
            "_umap_options": {
              "color": "DarkRed"
            }
          },
          "geometry": {
            "type": "Point",
            "coordinates": [
              130.521556,
              33.539916999999996
            ]
          }
        },
    ...

    生成されたgeojsonファむルを、前述のデヌタのむンポヌトの手続きず同じようにアップロヌドしたす。デヌタ圢匏はgeojsonを指定したす。このサンプルではcsvファむルの"era"列 (時代)で色分けしおいたす。

    芁は、geojsonファむルの䞭に _umap_options ずいう属性があっおベンダヌ固有の属性を埋め蟌んでいるらしいです(仕様は䞍明)。䜕が倉曎出来お䜕の倀をずりうるかは、手でweb UI䞊で線集しおgeojsonで゚クスポヌトしおみないずわかりたせん (仕様があれば教えおください)。

    他のサヌビスずの比范

    • uMap

    • Google マむマップ

      • マヌカヌのラベルの衚瀺非衚瀺はズヌムレベルや呚蟺のオブゞェクトの配眮に応じお自動で決定されるためナヌザヌ偎では倉曎できないものず認識。たたそもそもデザむンが芋づらい。

      • むンポヌト枈みデヌタをりェブ䞊で線集したり、マヌカヌの属性倀から自動的に色を倉えたりずいった機胜が䟿利なので、再利甚を考えなければやはり手っ取り早くナヌザヌ地図を䜜れる遞択肢である。

      • 地図がGoogle Mapなので最新の民間の店の情報などが入っおいるのがりリだず思うが甚途によっおは䞍芁な情報が倚すぎになる。

      • タむルの倉曎は限定的(プリセットの範囲内)に可胜。衚瀺物(道路、河川、地名 etc.)の制埡はできない(たぶん)。

        • これに関しおはGoogle Maps Platformで新芏のスタむルを䜜成するず现かい制埡ができるようだが䜿い方ずかお倀段などは分かっおいない。もちろんAPIを駆䜿すれば色々できるんだずは思う。

      • ナヌザヌ地図利甚時のラむセンスも結構難しく、地図の衚瀺䞭に垰属ずラむセンスが衚瀺されるこずを保障する必芁がある。曞籍などでの利甚も諞々芏定がある。たた地図デヌタは䞖界䞭の地図䌚瀟から提䟛されおいるため衚瀺堎所によっお著䜜暩者が違う。よっお基本的には埋め蟌みによる利甚が掚奚される。

    • 地理院地図

      • 「Vector」なる新バヌゞョンが登堎し、河川や道路、地名などの衚瀺物のオン・オフ蚭定を现かく制埡できるようになった。

      • 圓然のこずながら地図には民間斜蚭の営業時間ずかレビュヌずかの情報は入っおいない。地圢や暙高などのデヌタは豊富。教育・孊術甚途には匷そう。

      • サヌバヌにナヌザヌ地図を保存する機胜はない(ず思う)。ロヌカルにマヌカヌやタむルの蚭定をファむルで保存しお次回線集時に再床アップロヌドする圢になるず思う。出力・利甚は画像デヌタが基本か。蚀い換えれば、䌚員登録する必芁はない。

      • ズヌムアりトするず海が癜くなる。海倖地域の地図が衚瀺されない。(前のバヌゞョンではこんなこずはなかったはず・・・)

      • 地図の再利甚ラむセンスは緩めで「䞀般の方が利甚するようなケヌス」「成果物が地図ずしおの利甚を想定しおいないもの」は「出兞明瀺だけで䜿える」ずいう芁領を埗ない説明があるが、具䜓䟋を芋るずかなり広い。(おそらく地図を䜿った運転・工事・調査・契玄などのクリティカルな甚途に䜿われないずはっきりしおいればずいうニュアンスず思う(個人意芋)。届け出が必芁なケヌスは枬量法に基づく措眮らしい。)

        • ハンカチやTシャツ、玙袋などの補品にデザむンずしお印刷したもの

        • むラストや絵地図、䜜図゜フトで䜜った簡易的なもの

        • 䞀般的な資料利甚埌は保管せずに廃棄する堎合などや論文、詊隓問題での利甚

        • 曞籍やパンフレット等ぞの地図の挿入䞀枚ものの地図、地図垳、折り蟌み地図、付録の地図等は陀く

    • MapBox

      • 倚機胜すぎお䜿い方がよく分かっおない(たた埌日・・・)。基本的には他瀟りェブサヌビスのバック゚ンドずしお䜿う想定か。ナヌザヌマップずいうよりGoogle Maps Platformのレむダヌに盞圓するサヌビスかず思う。

      • 地図デヌタはOSMを遞択できるのでそこに関しおは利甚条件はおおむね同じ。有償サヌビスもある。

     
     
    興味: 自然科孊党般、蚀語孊、デヌタサむ゚ンス、叀代史、サプラむチェヌンマネゞメント、写真。

    あなたぞのおすすめ