SlideShare una empresa de Scribd logo
1 de 38
Descargar para leer sin conexión
納涼もんご祭り2014 
OpenStreetMap +MongoDB で 
地図情報を検索してみたい! 
2014.10.11 
MongoDB 日本ユーザー会 
MongoDB JP 
小笠原徳彦 (OGASAWARA, Naruhiko) 
Twitter : @naru0ga / mail: naruoga@gmail.com
今回のデモは何? 
今年のOSC 京都のブースデモで急遽作成したデモ 
Web プログラミング経験ほぼゼロな筆者が 
Ruby + Sinatra + MongoDB + OpenStreetMap 
(OpenLayers + Overpass API) で 
一週間で作成しました 
https://github.com/naruoga/findMatsuya
もちょっと詳しく! 
OpenStreetMap (以下OSM )のPOI ( Point Of 
Interest: なんかの地点情報)を取り出して 
MongoDB に取り込んで 
任意の地点の緯度経度をOSM から得て 
それをMongoDB で検索して 
JavaScript でOSM の地図上に表示
MongoDB とは 
この会場にいる以上説明は不要ですよね :) 
ドキュメント指向なゆるふわDB 
でもクエリーはけっこ強力 
地理空間インデックス 
なんてのもある! 
今回はこれ使いました
OpenStreetMap とは 
一言で言えば「地図のWikipedia 」 
http://www.openstreetmap.org/ / http://osm.jp/ 
みんなで参照して、みんなで編集できる地図 
地図情報そのものがオープン 
単に地図として使うだけでなく色々と楽しげな応用が
OpenStreetMap のデータ活用(1) 
OSM はPostGIS というPostgreSQL の地理情報拡 
張を採用しており、このデータは誰でもダンプ可能 
https://wiki.openstreetmap.org/wiki/Planet.osm 
これを直接MongoDB に取り込むこともできる 
https://github.com/ederoyd46/OSMImport 
ただ、カジュアルに使うにはちょいとデカいし、リアルタイ 
ムにシンクロとか考えると億劫
OpenStreetMap のデータ活用(2) 
もっとカジュアルなAPI もあるよ! 
Overpass API http://wiki.openstreetmap.org/wiki/Overpass_API 
REST API で地図情報を引っ張り出せる便利API 
出力はXML or JSON 
地図描画はOpenLayers http://openlayers.org 
Javascript でさくさく描画できるよ!
まずデータのダンプ 
特定のPOI をまるごと引き抜いてくるサンプル 
[out:json]; 
( 
node 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
way 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
); 
(._;>;); 
out;
まずデータのダンプ 
特定のPOI をまるごと引き抜いてくるサンプル 
[out:json]; 
( 
node 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
way 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
); 
(._;>;); 
out; 
出力は 
JSON で!
まずデータのダンプ 
特定のPOI をまるごと引き抜いてくるサンプル 
[out:json]; 
( 
node 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
way 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
); 
(._;>;); 
out; 
まずは 
点情報を
まずデータのダンプ 
特定のPOI をまるごと引き抜いてくるサンプル 
[out:json]; 
( 
node 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
way 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
); 
(._;>;); 
out; 
名前に 
「松屋」を 
含む
まずデータのダンプ 
特定のPOI をまるごと引き抜いてくるサンプル 
[out:json]; 
( 
node 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
way 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
); 
(._;>;); 
out; 
明らかに 
違う種類の 
POI を弾く
まずデータのダンプ 
特定のPOI をまるごと引き抜いてくるサンプル 
[out:json]; 
( 
node 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
way 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
); 
(._;>;); 
out; 
超よくある 
ノイズ
まずデータのダンプ 
特定のPOI をまるごと引き抜いてくるサンプル 
[out:json]; 
( 
node 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
way 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
); 
(._;>;); 
out; 
日本列島を 
囲む矩形(*) 
(*) ホントはややはみ出るけど 
そこに松屋はないので手抜き
まずデータのダンプ 
特定のPOI をまるごと引き抜いてくるサンプル 
[out:json]; 
( 
node 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
今度は 
ビルなどの 
線で書かれた 
way 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
); 
(._;>;); 
out; 
POI
まずデータのダンプ 
特定のPOI をまるごと引き抜いてくるサンプル 
[out:json]; 
( 
node 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
way 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
); 
(._;>;); 
out; 
以下node と 
おんなじ
まずデータのダンプ 
特定のPOI をまるごと引き抜いてくるサンプル 
[out:json]; 
( 
node 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
way 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
); 
(._;>;); 
out; 
way はnode の 
集合体なので 
再帰的に 
情報を要求
まずデータのダンプ 
特定のPOI をまるごと引き抜いてくるサンプル 
[out:json]; 
( 
node 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
way 
["name"~" 松屋"] 
["highway"!~"."] 
["railway"!~"."] 
["waterway"!~"."] 
["power"!~"."] 
["brand"!~" 西松屋"] 
["name"!~"^ 西松屋"] 
(29.32907,122.84827, 
46.38259,147.20285); 
); 
(._;>;); 
out; 
出力!
まずデータのダンプ 
このデータを以下のようにサーバーに送る 
$ wget --post-file request.txt -O stores.json 
http://overpass-api.de/api/interpreter 
結果はstores.json に出力される 
ここまでの情報は 
http://jnug.net/osm/overpassapi.html 
を参考にさせていただきました。ありがとう!
取り出したデータを覗く(1) 
{ 
"version": 0.6, 
"generator": "Overpass API", 
"osm3s": { 
"timestamp_osm_base": "2014-10-01T07:53:02Z", 
"copyright": "The data included in this document is from 
www.openstreetmap.org. 
The data is made available under ODbL." 
}, 
"elements": [ 
{ 
"type": "node", 
"id": 277208310, 
"lat": 35.5577222, 
"lon": 139.3553166, 
"tags": { 
"amenity": "fast_food", 
"brand": " 松屋", 
"name": " 松屋", 
"name:en": "Matsuya", 
"name:ja": " 松屋", 
"name:ja_rm": "Matsuya", 
"source": "survey" 
} 
}, … 
ヘッダー 
要素の中身 
(配列) 
$ wc stores.json 
10464 19064 219640 stores.json
取り出したデータを覗く(2) 
ヘッダー 
データの作成者( Overpass API ) 
バージョン 
ライセンス…… 
実体( elements ) 
JSON の配列 
POI 情報の実体
MongoDB に取り込む戦略 
これぐらいのサイズならとりあえずDB に放り込んで 
考えてもいい 
MongoDB は1 ドキュメント16MB の制限があるので、大 
きなJSON データを取り込むならちょっと考える必要が 
放り込んでからmongo シェルでデータ眺めながら 
Javascript 叩けばよさげ 
ここらへんのお気軽さがMongoDB のいいとこ
まずはインポート 
$ mongoimport --db fastfoods --collection foo --jsonArray stores.json 
データベース 
fastfoods の 
コレクション 
foo に 
一ファイルを 
JSON 配列 
として 
Overpass API で 
得た 
ファイルを 
取り込み
要素の展開 
要素をばらして別のコレクションに放り込む 
$ mongo fastfoods 
MongoDB shell version: 2.6.4 
connecting to: fastfoods 
> db.foo.findOne().elements.forEach(function(doc) { 
... db.elems.insert(doc) 
... }) 
elems 
コレクションに 
突っ込む 
foo に一個だけ入っている 
ドキュメントの 
elements という要素の配列を 
順次取り出して
展開した要素の確認 
> db.elems.findOne({type:"node"}) 
{ 
"_id" : ObjectId("542bb40d..."), 
"type" : "node", 
"id" : 277208310, 
"lat" : 35.5577222, 
"lon" : 139.3553166, 
"tags" : { 
"amenity" : "fast_food", 
"brand" : "松屋", 
"name" : "松屋", 
"name:en" : "Matsuya", 
"name:ja" : "松屋", 
"name:ja_rm" : "Matsuya", 
"source" : "survey" 
} 
} 
> db.elems.findOne({type:"way"}) 
{ 
"_id" : ObjectId("542bb40e..."), 
"type" : "way", 
"id" : 70555953, 
"nodes" : [ 
842006146, 
842006149, 
842006150, 
842006154, 
842006146 
], 
"tags" : { 
"building" : "yes", 
"name" : "松屋食料品", 
"source" : "estimated" 
} 
}
地理空間情報の変換 
MongoDB の地理空間インデックスを使うには、地 
理空間情報をGeoJSON 形式で格納する必要が 
http://geojson.org/ 
点( node )の情報 
{ type: "Point", coordinates: [ lon, lat ] } 
閉領域( way )の情報 
{ type: "Polygon", 
coordinates: [ [lon1, lat2], [lon2, lat2], ...] }
点( node )の変換 
シンプルな情報の読み替えでいいのでこんな感じ 
db.elems.find({type:"node", tags: {"$exists":true}}).forEach(function(doc){ 
doc["loc"] = { "type" : "Point", 
"coordinates" : 
[ parseFloat(doc.lon]), parseFloat(doc.lat) ] }; 
delete doc["lon"]; 
delete doc["lat"]; 
db.stores.insert(doc); 
}) 
タグが打ってあるノードに限定 
元のデータだと 
緯度経度情報は 
文字列なので 
数値に変換 
GeoJSON に変換した情報を 
お掃除
閉空間( way )の変換 
way を構成するnode の情報がいるので少し複雑 
すべてのway に対して 
db.elems.find({type:"way"}).forEach(function(doc){ 
var points = []; 
doc.nodes.forEach(function(node){ 
way内の全node を 
取り出して 
var nodeDoc = db.elems.findOne({id: node}); 
points.push([parseFloat(nodeDoc.lon), parseFloat(nodeDoc.lat)]) 
}); 
doc["loc"] = { type: "Polygon", coordinates : [ points ] }; 
delete doc["nodes"]; 
db.stores.insert(doc); 
}) 
座標を得て 
配列に 
push 
GeoJSON としては 
配列の配列
地理空間インデックスを張る 
コマンド一発! 
> db.stores.ensureIndex({loc: "2dsphere"}) 
{ 
"createdCollectionAutomatically" : false, 
"numIndexesBefore" : 1, 
"numIndexesAfter" : 2, 
"ok" : 1 
}
試しに検索 
適当な店舗の座標を中心に半径5km で検索 
> db.stores.find({loc: {$near: { $geometry: { type: "Point", coordinates : 
[139.3553166, 35.557722]}, $maxDistance : 5000 }}}) 
{ "_id" : ObjectId("542bb40d7072491a6a49335d"), "type" : "node", "id" : 
277208310, "tags" : { "amenity" : "fast_food", "brand" : " 松屋", "name" : 
" 松屋", "name:en" : "Matsuya", "name:ja" : " 松屋", "name:ja_rm" : 
"Matsuya", "source" : "survey" }, "loc" : { "type" : "Point", "coordinates" 
: [ 139.3553166, 35.5577222 ] } } 
{ "_id" : ObjectId("542bb40d7072491a6a4933c9"), "type" : "node", "id" : 
1682557982, "tags" : { "amenity" : "fast_food", "branch" : " 相模原店", 
"brand" : " 松屋", "cuisine" : "gyudon", "name" : " 松屋", "name:en" : 
"Matsuya", "name:ja" : " 松屋", "name:ja_rm" : "Matsuya", "wheelchair" : 
"no" }, "loc" : { "type" : "Point", "coordinates" : [ 139.3700845, 
35.5805666 ] } } 
...
アプリ側の話 
Ruby + Sinatra + mongo(*) + bson_ext 
ERB にJavascript 埋めてOpenLayers を利用 
入力された地点情報でOverpass API 引いて緯度 
経度情報を得て、MongoDB に問い合わせ 
その結果をOpenLayers でプロット 
(*) MongoDB のRuby 標準ドライバー
画面例 
ここに中心点を 
入力して 
検索 
OpenLayers による 
OSM 地図描画 
MongoDB への 
クエリー文字列
つまらない工夫など 
OSM のPOI は「東京駅」の場合、name:" 東京" 、 
railways:"station" とかになってる 
「駅」で終わる文字列は加工して検索 
Ruby の配列( =MongoDB のクエリ結果)をERB 
上のJavascript に渡したい 
ERB で変数展開してJS の配列に代入し直せばOK
謎?? 
Overpass API に手でクエリ投げると通るのに、Ruby 
からだとダメな時があって??? 
すみません未解決です……。
所感(1) 
シェルでJS 叩いてゴニョゴニョできるMongoDB は 
データをいじくりまわしながら考えるときにヨイ! 
シャーディングもレプリカセットもなくても、MongoDB を 
使うと嬉しい状況はいっぱいあるよ! 
パイロットデータをいじりながら考えたいときとか 
今回の応用だとOSM データのメタデータ参照エンジン 
として使うのもいいのでは
所感(2) 
今回ぐらいの規模ならRuby + Sinatra Good! 
Model の合計147 行、View 88 行 
覚えることが少ないのはハッピー 
OpenLayeres は割とわかりやすかったし楽しい 
このサイト↓入門によかった 
http://openstreetmap.piyolab.net/mapbyopenlayers.php
まとめ 
MongoDB の地理空間検索機能とOpenStreetMap 
の情報を作って、地図情報検索アプリを書いてみた 
考えながら作るときにはMongoDB サイコー 
地理空間検索楽しい 
OSM は色々いじれそうでこの組み合わせは遊べる 
地図ならGoogle Map という思い込みはやめよう!
Happy MongoDB & OpenStreetMap Life!

Más contenido relacionado

La actualidad más candente

Pythonではじめるロケーションデータ解析
Pythonではじめるロケーションデータ解析Pythonではじめるロケーションデータ解析
Pythonではじめるロケーションデータ解析Hiroaki Sengoku
 
オントロジーとは?
オントロジーとは?オントロジーとは?
オントロジーとは?Kouji Kozaki
 
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー!
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー! すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー!
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー! dcubeio
 
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎ken_kitahara
 
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送Google Cloud Platform - Japan
 
JDLA主催「CVPR2023技術報告会」発表資料
JDLA主催「CVPR2023技術報告会」発表資料JDLA主催「CVPR2023技術報告会」発表資料
JDLA主催「CVPR2023技術報告会」発表資料Morpho, Inc.
 
Linked Dataとオントロジーによるセマンティック技術の実際
Linked Dataとオントロジーによるセマンティック技術の実際Linked Dataとオントロジーによるセマンティック技術の実際
Linked Dataとオントロジーによるセマンティック技術の実際Kouji Kozaki
 
JavaScript GIS ライブラリ turf.js 入門
JavaScript GIS ライブラリ turf.js 入門JavaScript GIS ライブラリ turf.js 入門
JavaScript GIS ライブラリ turf.js 入門Takahiro Kamada
 
Linked Open Data (LOD)の基礎講座
Linked Open Data (LOD)の基礎講座Linked Open Data (LOD)の基礎講座
Linked Open Data (LOD)の基礎講座Kouji Kozaki
 
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52Yahoo!デベロッパーネットワーク
 
Open3DでSLAM入門 PyCon Kyushu 2018
Open3DでSLAM入門 PyCon Kyushu 2018Open3DでSLAM入門 PyCon Kyushu 2018
Open3DでSLAM入門 PyCon Kyushu 2018Satoshi Fujimoto
 
アプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なことアプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なことTakao Sumitomo
 
NVIDIA GPUで作るHeadless X11 Linux
NVIDIA GPUで作るHeadless X11 LinuxNVIDIA GPUで作るHeadless X11 Linux
NVIDIA GPUで作るHeadless X11 LinuxTomoki SHISHIKURA
 
オープンデータを入手してQGISで開いてみよう!
オープンデータを入手してQGISで開いてみよう!オープンデータを入手してQGISで開いてみよう!
オープンデータを入手してQGISで開いてみよう!Masaharu Ohashi
 
IoTデバイスデータ収集の難しい点
IoTデバイスデータ収集の難しい点IoTデバイスデータ収集の難しい点
IoTデバイスデータ収集の難しい点Tetsutaro Watanabe
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門Hisashi HATAKEYAMA
 
エンジニアから都庁へ~中の人が語る街のDX、都庁のDX~
エンジニアから都庁へ~中の人が語る街のDX、都庁のDX~エンジニアから都庁へ~中の人が語る街のDX、都庁のDX~
エンジニアから都庁へ~中の人が語る街のDX、都庁のDX~Norisuke Hirai
 
2018 builderscon airflowを用いて、 複雑大規模なジョブフロー管理 に立ち向かう
2018 builderscon airflowを用いて、 複雑大規模なジョブフロー管理 に立ち向かう2018 builderscon airflowを用いて、 複雑大規模なジョブフロー管理 に立ち向かう
2018 builderscon airflowを用いて、 複雑大規模なジョブフロー管理 に立ち向かうBrainPad Inc.
 
モダンフロントエンド開発者に求められるスキルとは
モダンフロントエンド開発者に求められるスキルとはモダンフロントエンド開発者に求められるスキルとは
モダンフロントエンド開発者に求められるスキルとはTakuya Tejima
 

La actualidad más candente (20)

Pythonではじめるロケーションデータ解析
Pythonではじめるロケーションデータ解析Pythonではじめるロケーションデータ解析
Pythonではじめるロケーションデータ解析
 
オントロジーとは?
オントロジーとは?オントロジーとは?
オントロジーとは?
 
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー!
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー! すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー!
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー!
 
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎
 
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
 
JDLA主催「CVPR2023技術報告会」発表資料
JDLA主催「CVPR2023技術報告会」発表資料JDLA主催「CVPR2023技術報告会」発表資料
JDLA主催「CVPR2023技術報告会」発表資料
 
Linked Dataとオントロジーによるセマンティック技術の実際
Linked Dataとオントロジーによるセマンティック技術の実際Linked Dataとオントロジーによるセマンティック技術の実際
Linked Dataとオントロジーによるセマンティック技術の実際
 
JavaScript GIS ライブラリ turf.js 入門
JavaScript GIS ライブラリ turf.js 入門JavaScript GIS ライブラリ turf.js 入門
JavaScript GIS ライブラリ turf.js 入門
 
Linked Open Data (LOD)の基礎講座
Linked Open Data (LOD)の基礎講座Linked Open Data (LOD)の基礎講座
Linked Open Data (LOD)の基礎講座
 
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
 
Open3DでSLAM入門 PyCon Kyushu 2018
Open3DでSLAM入門 PyCon Kyushu 2018Open3DでSLAM入門 PyCon Kyushu 2018
Open3DでSLAM入門 PyCon Kyushu 2018
 
アプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なことアプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なこと
 
NVIDIA GPUで作るHeadless X11 Linux
NVIDIA GPUで作るHeadless X11 LinuxNVIDIA GPUで作るHeadless X11 Linux
NVIDIA GPUで作るHeadless X11 Linux
 
オープンデータを入手してQGISで開いてみよう!
オープンデータを入手してQGISで開いてみよう!オープンデータを入手してQGISで開いてみよう!
オープンデータを入手してQGISで開いてみよう!
 
IoTデバイスデータ収集の難しい点
IoTデバイスデータ収集の難しい点IoTデバイスデータ収集の難しい点
IoTデバイスデータ収集の難しい点
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門
 
エンジニアから都庁へ~中の人が語る街のDX、都庁のDX~
エンジニアから都庁へ~中の人が語る街のDX、都庁のDX~エンジニアから都庁へ~中の人が語る街のDX、都庁のDX~
エンジニアから都庁へ~中の人が語る街のDX、都庁のDX~
 
2018 builderscon airflowを用いて、 複雑大規模なジョブフロー管理 に立ち向かう
2018 builderscon airflowを用いて、 複雑大規模なジョブフロー管理 に立ち向かう2018 builderscon airflowを用いて、 複雑大規模なジョブフロー管理 に立ち向かう
2018 builderscon airflowを用いて、 複雑大規模なジョブフロー管理 に立ち向かう
 
モダンフロントエンド開発者に求められるスキルとは
モダンフロントエンド開発者に求められるスキルとはモダンフロントエンド開発者に求められるスキルとは
モダンフロントエンド開発者に求められるスキルとは
 
DBpedia Japaneseとは?
DBpedia Japaneseとは?DBpedia Japaneseとは?
DBpedia Japaneseとは?
 

Destacado

オープンデータからOpenStreetMapへのデータ投入方法とOverpass API
オープンデータからOpenStreetMapへのデータ投入方法とOverpass APIオープンデータからOpenStreetMapへのデータ投入方法とOverpass API
オープンデータからOpenStreetMapへのデータ投入方法とOverpass APIYasuyuki Uno
 
技適なBluetooth GNSS/GPSレシーバーをRaspberryPiで作りたい
技適なBluetooth GNSS/GPSレシーバーをRaspberryPiで作りたい技適なBluetooth GNSS/GPSレシーバーをRaspberryPiで作りたい
技適なBluetooth GNSS/GPSレシーバーをRaspberryPiで作りたいKenichiro MATOHARA
 
QGISセミナー中級編(V2.4)
QGISセミナー中級編(V2.4)QGISセミナー中級編(V2.4)
QGISセミナー中級編(V2.4)IWASAKI NOBUSUKE
 
WebGIS初級編 - OpenLayersで簡単作成
WebGIS初級編 - OpenLayersで簡単作成WebGIS初級編 - OpenLayersで簡単作成
WebGIS初級編 - OpenLayersで簡単作成Hideo Harada
 
オープンデータとオープンソースGisを用いたweb上でのインタラクティブ可視化手法について
オープンデータとオープンソースGisを用いたweb上でのインタラクティブ可視化手法についてオープンデータとオープンソースGisを用いたweb上でのインタラクティブ可視化手法について
オープンデータとオープンソースGisを用いたweb上でのインタラクティブ可視化手法についてRyousuke Wayama
 
MongoDBと位置情報 ~地理空間インデックスの紹介
MongoDBと位置情報 ~地理空間インデックスの紹介MongoDBと位置情報 ~地理空間インデックスの紹介
MongoDBと位置情報 ~地理空間インデックスの紹介Koji Iwazaki
 

Destacado (7)

オープンデータからOpenStreetMapへのデータ投入方法とOverpass API
オープンデータからOpenStreetMapへのデータ投入方法とOverpass APIオープンデータからOpenStreetMapへのデータ投入方法とOverpass API
オープンデータからOpenStreetMapへのデータ投入方法とOverpass API
 
技適なBluetooth GNSS/GPSレシーバーをRaspberryPiで作りたい
技適なBluetooth GNSS/GPSレシーバーをRaspberryPiで作りたい技適なBluetooth GNSS/GPSレシーバーをRaspberryPiで作りたい
技適なBluetooth GNSS/GPSレシーバーをRaspberryPiで作りたい
 
QGISセミナー中級編(V2.4)
QGISセミナー中級編(V2.4)QGISセミナー中級編(V2.4)
QGISセミナー中級編(V2.4)
 
WebGIS初級編 - OpenLayersで簡単作成
WebGIS初級編 - OpenLayersで簡単作成WebGIS初級編 - OpenLayersで簡単作成
WebGIS初級編 - OpenLayersで簡単作成
 
オープンデータとオープンソースGisを用いたweb上でのインタラクティブ可視化手法について
オープンデータとオープンソースGisを用いたweb上でのインタラクティブ可視化手法についてオープンデータとオープンソースGisを用いたweb上でのインタラクティブ可視化手法について
オープンデータとオープンソースGisを用いたweb上でのインタラクティブ可視化手法について
 
GPS で色々遊ぶ
GPS で色々遊ぶGPS で色々遊ぶ
GPS で色々遊ぶ
 
MongoDBと位置情報 ~地理空間インデックスの紹介
MongoDBと位置情報 ~地理空間インデックスの紹介MongoDBと位置情報 ~地理空間インデックスの紹介
MongoDBと位置情報 ~地理空間インデックスの紹介
 

Similar a OpenStreetMap+MongoDBで地図情報を検索してみたい!

iTamabi 13 第9回:ARTSAT API 実践 3 ジオコーディングで衛星の位置を取得
iTamabi 13 第9回:ARTSAT API 実践 3 ジオコーディングで衛星の位置を取得iTamabi 13 第9回:ARTSAT API 実践 3 ジオコーディングで衛星の位置を取得
iTamabi 13 第9回:ARTSAT API 実践 3 ジオコーディングで衛星の位置を取得Atsushi Tadokoro
 
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-uedayou
 
Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringMakoto Ohnami
 
Develop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressAkinari Tsugo
 
SPARQLとMashup環境 (年岡先生)
SPARQLとMashup環境 (年岡先生)SPARQLとMashup環境 (年岡先生)
SPARQLとMashup環境 (年岡先生)Shun Shiramatsu
 
Spring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractSpring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractTakeshi Ogawa
 
D3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーションD3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーションKohei Kadowaki
 
Osc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-databaseOsc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-databaseToshi Harada
 
AWS SDK for Smalltalk
AWS SDK for SmalltalkAWS SDK for Smalltalk
AWS SDK for SmalltalkSho Yoshida
 
WordBench京都12月、WordCampUSからのWP REST APIな話
WordBench京都12月、WordCampUSからのWP REST APIな話WordBench京都12月、WordCampUSからのWP REST APIな話
WordBench京都12月、WordCampUSからのWP REST APIな話Hidetaka Okamoto
 
pg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいことpg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいことMasahiko Sawada
 
Couchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 OmoidenoteCouchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 Omoidenotekitsugi
 
SORACOM Technology Camp 2018 ベーシックトラック3 | 今日から始めるセンサーデータの可視化
SORACOM Technology Camp 2018 ベーシックトラック3 | 今日から始めるセンサーデータの可視化SORACOM Technology Camp 2018 ベーシックトラック3 | 今日から始めるセンサーデータの可視化
SORACOM Technology Camp 2018 ベーシックトラック3 | 今日から始めるセンサーデータの可視化SORACOM,INC
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック庸介 高橋
 
PBL1-v1-006j.pptx
PBL1-v1-006j.pptxPBL1-v1-006j.pptx
PBL1-v1-006j.pptxNAIST
 
Jpug study-jsonb-datatype-20141011
Jpug study-jsonb-datatype-20141011Jpug study-jsonb-datatype-20141011
Jpug study-jsonb-datatype-20141011Toshi Harada
 
FRT Vol. 4 インサイド・クラウドプラットフォーム
FRT Vol. 4 インサイド・クラウドプラットフォームFRT Vol. 4 インサイド・クラウドプラットフォーム
FRT Vol. 4 インサイド・クラウドプラットフォームYasunari Goto (iChain. Inc.)
 
20171103 pg con-jp-lt-plpgsql
20171103 pg con-jp-lt-plpgsql20171103 pg con-jp-lt-plpgsql
20171103 pg con-jp-lt-plpgsqlToshi Harada
 

Similar a OpenStreetMap+MongoDBで地図情報を検索してみたい! (20)

iTamabi 13 第9回:ARTSAT API 実践 3 ジオコーディングで衛星の位置を取得
iTamabi 13 第9回:ARTSAT API 実践 3 ジオコーディングで衛星の位置を取得iTamabi 13 第9回:ARTSAT API 実践 3 ジオコーディングで衛星の位置を取得
iTamabi 13 第9回:ARTSAT API 実践 3 ジオコーディングで衛星の位置を取得
 
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
 
Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo Spring
 
Develop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + Express
 
SPARQLとMashup環境 (年岡先生)
SPARQLとMashup環境 (年岡先生)SPARQLとMashup環境 (年岡先生)
SPARQLとMashup環境 (年岡先生)
 
Spring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractSpring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contract
 
D3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーションD3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーション
 
Tokyo r 25_lt_isobe
Tokyo r 25_lt_isobeTokyo r 25_lt_isobe
Tokyo r 25_lt_isobe
 
Osc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-databaseOsc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-database
 
AWS SDK for Smalltalk
AWS SDK for SmalltalkAWS SDK for Smalltalk
AWS SDK for Smalltalk
 
WordBench京都12月、WordCampUSからのWP REST APIな話
WordBench京都12月、WordCampUSからのWP REST APIな話WordBench京都12月、WordCampUSからのWP REST APIな話
WordBench京都12月、WordCampUSからのWP REST APIな話
 
pg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいことpg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいこと
 
MongoDBの使い方
MongoDBの使い方MongoDBの使い方
MongoDBの使い方
 
Couchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 OmoidenoteCouchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 Omoidenote
 
SORACOM Technology Camp 2018 ベーシックトラック3 | 今日から始めるセンサーデータの可視化
SORACOM Technology Camp 2018 ベーシックトラック3 | 今日から始めるセンサーデータの可視化SORACOM Technology Camp 2018 ベーシックトラック3 | 今日から始めるセンサーデータの可視化
SORACOM Technology Camp 2018 ベーシックトラック3 | 今日から始めるセンサーデータの可視化
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
 
PBL1-v1-006j.pptx
PBL1-v1-006j.pptxPBL1-v1-006j.pptx
PBL1-v1-006j.pptx
 
Jpug study-jsonb-datatype-20141011
Jpug study-jsonb-datatype-20141011Jpug study-jsonb-datatype-20141011
Jpug study-jsonb-datatype-20141011
 
FRT Vol. 4 インサイド・クラウドプラットフォーム
FRT Vol. 4 インサイド・クラウドプラットフォームFRT Vol. 4 インサイド・クラウドプラットフォーム
FRT Vol. 4 インサイド・クラウドプラットフォーム
 
20171103 pg con-jp-lt-plpgsql
20171103 pg con-jp-lt-plpgsql20171103 pg con-jp-lt-plpgsql
20171103 pg con-jp-lt-plpgsql
 

Más de Naruhiko Ogasawara

さらばデスクトップ?モバイル・クラウド時代のLibreOfficeの挑戦/LibreOffice current status, or the chall...
さらばデスクトップ?モバイル・クラウド時代のLibreOfficeの挑戦/LibreOffice current status, or the chall...さらばデスクトップ?モバイル・クラウド時代のLibreOfficeの挑戦/LibreOffice current status, or the chall...
さらばデスクトップ?モバイル・クラウド時代のLibreOfficeの挑戦/LibreOffice current status, or the chall...Naruhiko Ogasawara
 
最新のデスクトップアプリを使おう:Snap, Flatpak, AppImage
最新のデスクトップアプリを使おう:Snap, Flatpak, AppImage最新のデスクトップアプリを使おう:Snap, Flatpak, AppImage
最新のデスクトップアプリを使おう:Snap, Flatpak, AppImageNaruhiko Ogasawara
 
LibreOffice Asia Conference 2019 Tokyo; what we had achieved, and what's next
LibreOffice Asia Conference 2019 Tokyo; what we had achieved, and what's nextLibreOffice Asia Conference 2019 Tokyo; what we had achieved, and what's next
LibreOffice Asia Conference 2019 Tokyo; what we had achieved, and what's nextNaruhiko Ogasawara
 
The Document Foundationについて / About The Document Foundation
The Document Foundationについて / About The Document FoundationThe Document Foundationについて / About The Document Foundation
The Document Foundationについて / About The Document FoundationNaruhiko Ogasawara
 
TDFと寄付、メンバーシップ、認定制度 / TDF and donation, membership and certification
TDFと寄付、メンバーシップ、認定制度 / TDF and donation, membership and certificationTDFと寄付、メンバーシップ、認定制度 / TDF and donation, membership and certification
TDFと寄付、メンバーシップ、認定制度 / TDF and donation, membership and certificationNaruhiko Ogasawara
 
Building a bridge between Japanese LibreOffice community and the world
Building a bridge between Japanese LibreOffice community and the worldBuilding a bridge between Japanese LibreOffice community and the world
Building a bridge between Japanese LibreOffice community and the worldNaruhiko Ogasawara
 
Happy Software Freedom Day! (Koedo Linux Users Group, Tokyo, Japan)
Happy Software Freedom Day! (Koedo Linux Users Group, Tokyo, Japan)Happy Software Freedom Day! (Koedo Linux Users Group, Tokyo, Japan)
Happy Software Freedom Day! (Koedo Linux Users Group, Tokyo, Japan)Naruhiko Ogasawara
 
宣伝:SeleniumConf Tokyo 2019やりますよ!
宣伝:SeleniumConf Tokyo 2019やりますよ!宣伝:SeleniumConf Tokyo 2019やりますよ!
宣伝:SeleniumConf Tokyo 2019やりますよ!Naruhiko Ogasawara
 
Using latest LibreOffice on openSUSE Leap 15 - by modern packaging systems
Using latest LibreOffice on openSUSE Leap 15 - by modern packaging systemsUsing latest LibreOffice on openSUSE Leap 15 - by modern packaging systems
Using latest LibreOffice on openSUSE Leap 15 - by modern packaging systemsNaruhiko Ogasawara
 
The Document Foundationについて
The Document FoundationについてThe Document Foundationについて
The Document FoundationについてNaruhiko Ogasawara
 
LibreOffice: The Office Suite with Mixing Bowl Culture
LibreOffice: The Office Suite with Mixing Bowl CultureLibreOffice: The Office Suite with Mixing Bowl Culture
LibreOffice: The Office Suite with Mixing Bowl CultureNaruhiko Ogasawara
 
Make It Better Together: コミュニティを主体としたLibreOffice翻訳 / : Community-centered Lib...
Make It Better Together: コミュニティを主体としたLibreOffice翻訳 / : Community-centered Lib...Make It Better Together: コミュニティを主体としたLibreOffice翻訳 / : Community-centered Lib...
Make It Better Together: コミュニティを主体としたLibreOffice翻訳 / : Community-centered Lib...Naruhiko Ogasawara
 
Hospital days in czech / チェコで入院した話
Hospital days in czech / チェコで入院した話Hospital days in czech / チェコで入院した話
Hospital days in czech / チェコで入院した話Naruhiko Ogasawara
 
openSUSEユーザーに向けたLibreOffice入門 / Introduction of LibreOffice for openSUSE users
openSUSEユーザーに向けたLibreOffice入門 / Introduction of LibreOffice for openSUSE usersopenSUSEユーザーに向けたLibreOffice入門 / Introduction of LibreOffice for openSUSE users
openSUSEユーザーに向けたLibreOffice入門 / Introduction of LibreOffice for openSUSE usersNaruhiko Ogasawara
 
Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...
Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...
Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...Naruhiko Ogasawara
 
LibreOfficeの最新動向 / LibreOffice current status
LibreOfficeの最新動向 / LibreOffice current statusLibreOfficeの最新動向 / LibreOffice current status
LibreOfficeの最新動向 / LibreOffice current statusNaruhiko Ogasawara
 
Vertical Writing: typical use-cases and current status in LibreOffice
Vertical Writing: typical use-cases and current status in LibreOfficeVertical Writing: typical use-cases and current status in LibreOffice
Vertical Writing: typical use-cases and current status in LibreOfficeNaruhiko Ogasawara
 
LibreOffice, the free office productive suite and it's status of accessibilit...
LibreOffice, the free office productive suite and it's status of accessibilit...LibreOffice, the free office productive suite and it's status of accessibilit...
LibreOffice, the free office productive suite and it's status of accessibilit...Naruhiko Ogasawara
 

Más de Naruhiko Ogasawara (20)

さらばデスクトップ?モバイル・クラウド時代のLibreOfficeの挑戦/LibreOffice current status, or the chall...
さらばデスクトップ?モバイル・クラウド時代のLibreOfficeの挑戦/LibreOffice current status, or the chall...さらばデスクトップ?モバイル・クラウド時代のLibreOfficeの挑戦/LibreOffice current status, or the chall...
さらばデスクトップ?モバイル・クラウド時代のLibreOfficeの挑戦/LibreOffice current status, or the chall...
 
最新のデスクトップアプリを使おう:Snap, Flatpak, AppImage
最新のデスクトップアプリを使おう:Snap, Flatpak, AppImage最新のデスクトップアプリを使おう:Snap, Flatpak, AppImage
最新のデスクトップアプリを使おう:Snap, Flatpak, AppImage
 
LibreOffice Asia Conference 2019 Tokyo; what we had achieved, and what's next
LibreOffice Asia Conference 2019 Tokyo; what we had achieved, and what's nextLibreOffice Asia Conference 2019 Tokyo; what we had achieved, and what's next
LibreOffice Asia Conference 2019 Tokyo; what we had achieved, and what's next
 
小江戸らぐBBQ 2019
小江戸らぐBBQ 2019小江戸らぐBBQ 2019
小江戸らぐBBQ 2019
 
The Document Foundationについて / About The Document Foundation
The Document Foundationについて / About The Document FoundationThe Document Foundationについて / About The Document Foundation
The Document Foundationについて / About The Document Foundation
 
TDFと寄付、メンバーシップ、認定制度 / TDF and donation, membership and certification
TDFと寄付、メンバーシップ、認定制度 / TDF and donation, membership and certificationTDFと寄付、メンバーシップ、認定制度 / TDF and donation, membership and certification
TDFと寄付、メンバーシップ、認定制度 / TDF and donation, membership and certification
 
Building a bridge between Japanese LibreOffice community and the world
Building a bridge between Japanese LibreOffice community and the worldBuilding a bridge between Japanese LibreOffice community and the world
Building a bridge between Japanese LibreOffice community and the world
 
Happy Software Freedom Day! (Koedo Linux Users Group, Tokyo, Japan)
Happy Software Freedom Day! (Koedo Linux Users Group, Tokyo, Japan)Happy Software Freedom Day! (Koedo Linux Users Group, Tokyo, Japan)
Happy Software Freedom Day! (Koedo Linux Users Group, Tokyo, Japan)
 
宣伝:SeleniumConf Tokyo 2019やりますよ!
宣伝:SeleniumConf Tokyo 2019やりますよ!宣伝:SeleniumConf Tokyo 2019やりますよ!
宣伝:SeleniumConf Tokyo 2019やりますよ!
 
Using latest LibreOffice on openSUSE Leap 15 - by modern packaging systems
Using latest LibreOffice on openSUSE Leap 15 - by modern packaging systemsUsing latest LibreOffice on openSUSE Leap 15 - by modern packaging systems
Using latest LibreOffice on openSUSE Leap 15 - by modern packaging systems
 
The Document Foundationについて
The Document FoundationについてThe Document Foundationについて
The Document Foundationについて
 
告知 ー OSnuC Kawagoe 2018
告知 ー OSnuC Kawagoe 2018告知 ー OSnuC Kawagoe 2018
告知 ー OSnuC Kawagoe 2018
 
LibreOffice: The Office Suite with Mixing Bowl Culture
LibreOffice: The Office Suite with Mixing Bowl CultureLibreOffice: The Office Suite with Mixing Bowl Culture
LibreOffice: The Office Suite with Mixing Bowl Culture
 
Make It Better Together: コミュニティを主体としたLibreOffice翻訳 / : Community-centered Lib...
Make It Better Together: コミュニティを主体としたLibreOffice翻訳 / : Community-centered Lib...Make It Better Together: コミュニティを主体としたLibreOffice翻訳 / : Community-centered Lib...
Make It Better Together: コミュニティを主体としたLibreOffice翻訳 / : Community-centered Lib...
 
Hospital days in czech / チェコで入院した話
Hospital days in czech / チェコで入院した話Hospital days in czech / チェコで入院した話
Hospital days in czech / チェコで入院した話
 
openSUSEユーザーに向けたLibreOffice入門 / Introduction of LibreOffice for openSUSE users
openSUSEユーザーに向けたLibreOffice入門 / Introduction of LibreOffice for openSUSE usersopenSUSEユーザーに向けたLibreOffice入門 / Introduction of LibreOffice for openSUSE users
openSUSEユーザーに向けたLibreOffice入門 / Introduction of LibreOffice for openSUSE users
 
Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...
Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...
Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...
 
LibreOfficeの最新動向 / LibreOffice current status
LibreOfficeの最新動向 / LibreOffice current statusLibreOfficeの最新動向 / LibreOffice current status
LibreOfficeの最新動向 / LibreOffice current status
 
Vertical Writing: typical use-cases and current status in LibreOffice
Vertical Writing: typical use-cases and current status in LibreOfficeVertical Writing: typical use-cases and current status in LibreOffice
Vertical Writing: typical use-cases and current status in LibreOffice
 
LibreOffice, the free office productive suite and it's status of accessibilit...
LibreOffice, the free office productive suite and it's status of accessibilit...LibreOffice, the free office productive suite and it's status of accessibilit...
LibreOffice, the free office productive suite and it's status of accessibilit...
 

Último

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 

Último (11)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 

OpenStreetMap+MongoDBで地図情報を検索してみたい!

  • 1. 納涼もんご祭り2014 OpenStreetMap +MongoDB で 地図情報を検索してみたい! 2014.10.11 MongoDB 日本ユーザー会 MongoDB JP 小笠原徳彦 (OGASAWARA, Naruhiko) Twitter : @naru0ga / mail: naruoga@gmail.com
  • 2. 今回のデモは何? 今年のOSC 京都のブースデモで急遽作成したデモ Web プログラミング経験ほぼゼロな筆者が Ruby + Sinatra + MongoDB + OpenStreetMap (OpenLayers + Overpass API) で 一週間で作成しました https://github.com/naruoga/findMatsuya
  • 3. もちょっと詳しく! OpenStreetMap (以下OSM )のPOI ( Point Of Interest: なんかの地点情報)を取り出して MongoDB に取り込んで 任意の地点の緯度経度をOSM から得て それをMongoDB で検索して JavaScript でOSM の地図上に表示
  • 4. MongoDB とは この会場にいる以上説明は不要ですよね :) ドキュメント指向なゆるふわDB でもクエリーはけっこ強力 地理空間インデックス なんてのもある! 今回はこれ使いました
  • 5. OpenStreetMap とは 一言で言えば「地図のWikipedia 」 http://www.openstreetmap.org/ / http://osm.jp/ みんなで参照して、みんなで編集できる地図 地図情報そのものがオープン 単に地図として使うだけでなく色々と楽しげな応用が
  • 6. OpenStreetMap のデータ活用(1) OSM はPostGIS というPostgreSQL の地理情報拡 張を採用しており、このデータは誰でもダンプ可能 https://wiki.openstreetmap.org/wiki/Planet.osm これを直接MongoDB に取り込むこともできる https://github.com/ederoyd46/OSMImport ただ、カジュアルに使うにはちょいとデカいし、リアルタイ ムにシンクロとか考えると億劫
  • 7. OpenStreetMap のデータ活用(2) もっとカジュアルなAPI もあるよ! Overpass API http://wiki.openstreetmap.org/wiki/Overpass_API REST API で地図情報を引っ張り出せる便利API 出力はXML or JSON 地図描画はOpenLayers http://openlayers.org Javascript でさくさく描画できるよ!
  • 8. まずデータのダンプ 特定のPOI をまるごと引き抜いてくるサンプル [out:json]; ( node ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); way ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); ); (._;>;); out;
  • 9. まずデータのダンプ 特定のPOI をまるごと引き抜いてくるサンプル [out:json]; ( node ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); way ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); ); (._;>;); out; 出力は JSON で!
  • 10. まずデータのダンプ 特定のPOI をまるごと引き抜いてくるサンプル [out:json]; ( node ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); way ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); ); (._;>;); out; まずは 点情報を
  • 11. まずデータのダンプ 特定のPOI をまるごと引き抜いてくるサンプル [out:json]; ( node ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); way ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); ); (._;>;); out; 名前に 「松屋」を 含む
  • 12. まずデータのダンプ 特定のPOI をまるごと引き抜いてくるサンプル [out:json]; ( node ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); way ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); ); (._;>;); out; 明らかに 違う種類の POI を弾く
  • 13. まずデータのダンプ 特定のPOI をまるごと引き抜いてくるサンプル [out:json]; ( node ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); way ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); ); (._;>;); out; 超よくある ノイズ
  • 14. まずデータのダンプ 特定のPOI をまるごと引き抜いてくるサンプル [out:json]; ( node ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); way ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); ); (._;>;); out; 日本列島を 囲む矩形(*) (*) ホントはややはみ出るけど そこに松屋はないので手抜き
  • 15. まずデータのダンプ 特定のPOI をまるごと引き抜いてくるサンプル [out:json]; ( node ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); 今度は ビルなどの 線で書かれた way ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); ); (._;>;); out; POI
  • 16. まずデータのダンプ 特定のPOI をまるごと引き抜いてくるサンプル [out:json]; ( node ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); way ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); ); (._;>;); out; 以下node と おんなじ
  • 17. まずデータのダンプ 特定のPOI をまるごと引き抜いてくるサンプル [out:json]; ( node ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); way ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); ); (._;>;); out; way はnode の 集合体なので 再帰的に 情報を要求
  • 18. まずデータのダンプ 特定のPOI をまるごと引き抜いてくるサンプル [out:json]; ( node ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); way ["name"~" 松屋"] ["highway"!~"."] ["railway"!~"."] ["waterway"!~"."] ["power"!~"."] ["brand"!~" 西松屋"] ["name"!~"^ 西松屋"] (29.32907,122.84827, 46.38259,147.20285); ); (._;>;); out; 出力!
  • 19. まずデータのダンプ このデータを以下のようにサーバーに送る $ wget --post-file request.txt -O stores.json http://overpass-api.de/api/interpreter 結果はstores.json に出力される ここまでの情報は http://jnug.net/osm/overpassapi.html を参考にさせていただきました。ありがとう!
  • 20. 取り出したデータを覗く(1) { "version": 0.6, "generator": "Overpass API", "osm3s": { "timestamp_osm_base": "2014-10-01T07:53:02Z", "copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL." }, "elements": [ { "type": "node", "id": 277208310, "lat": 35.5577222, "lon": 139.3553166, "tags": { "amenity": "fast_food", "brand": " 松屋", "name": " 松屋", "name:en": "Matsuya", "name:ja": " 松屋", "name:ja_rm": "Matsuya", "source": "survey" } }, … ヘッダー 要素の中身 (配列) $ wc stores.json 10464 19064 219640 stores.json
  • 21. 取り出したデータを覗く(2) ヘッダー データの作成者( Overpass API ) バージョン ライセンス…… 実体( elements ) JSON の配列 POI 情報の実体
  • 22. MongoDB に取り込む戦略 これぐらいのサイズならとりあえずDB に放り込んで 考えてもいい MongoDB は1 ドキュメント16MB の制限があるので、大 きなJSON データを取り込むならちょっと考える必要が 放り込んでからmongo シェルでデータ眺めながら Javascript 叩けばよさげ ここらへんのお気軽さがMongoDB のいいとこ
  • 23. まずはインポート $ mongoimport --db fastfoods --collection foo --jsonArray stores.json データベース fastfoods の コレクション foo に 一ファイルを JSON 配列 として Overpass API で 得た ファイルを 取り込み
  • 24. 要素の展開 要素をばらして別のコレクションに放り込む $ mongo fastfoods MongoDB shell version: 2.6.4 connecting to: fastfoods > db.foo.findOne().elements.forEach(function(doc) { ... db.elems.insert(doc) ... }) elems コレクションに 突っ込む foo に一個だけ入っている ドキュメントの elements という要素の配列を 順次取り出して
  • 25. 展開した要素の確認 > db.elems.findOne({type:"node"}) { "_id" : ObjectId("542bb40d..."), "type" : "node", "id" : 277208310, "lat" : 35.5577222, "lon" : 139.3553166, "tags" : { "amenity" : "fast_food", "brand" : "松屋", "name" : "松屋", "name:en" : "Matsuya", "name:ja" : "松屋", "name:ja_rm" : "Matsuya", "source" : "survey" } } > db.elems.findOne({type:"way"}) { "_id" : ObjectId("542bb40e..."), "type" : "way", "id" : 70555953, "nodes" : [ 842006146, 842006149, 842006150, 842006154, 842006146 ], "tags" : { "building" : "yes", "name" : "松屋食料品", "source" : "estimated" } }
  • 26. 地理空間情報の変換 MongoDB の地理空間インデックスを使うには、地 理空間情報をGeoJSON 形式で格納する必要が http://geojson.org/ 点( node )の情報 { type: "Point", coordinates: [ lon, lat ] } 閉領域( way )の情報 { type: "Polygon", coordinates: [ [lon1, lat2], [lon2, lat2], ...] }
  • 27. 点( node )の変換 シンプルな情報の読み替えでいいのでこんな感じ db.elems.find({type:"node", tags: {"$exists":true}}).forEach(function(doc){ doc["loc"] = { "type" : "Point", "coordinates" : [ parseFloat(doc.lon]), parseFloat(doc.lat) ] }; delete doc["lon"]; delete doc["lat"]; db.stores.insert(doc); }) タグが打ってあるノードに限定 元のデータだと 緯度経度情報は 文字列なので 数値に変換 GeoJSON に変換した情報を お掃除
  • 28. 閉空間( way )の変換 way を構成するnode の情報がいるので少し複雑 すべてのway に対して db.elems.find({type:"way"}).forEach(function(doc){ var points = []; doc.nodes.forEach(function(node){ way内の全node を 取り出して var nodeDoc = db.elems.findOne({id: node}); points.push([parseFloat(nodeDoc.lon), parseFloat(nodeDoc.lat)]) }); doc["loc"] = { type: "Polygon", coordinates : [ points ] }; delete doc["nodes"]; db.stores.insert(doc); }) 座標を得て 配列に push GeoJSON としては 配列の配列
  • 29. 地理空間インデックスを張る コマンド一発! > db.stores.ensureIndex({loc: "2dsphere"}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
  • 30. 試しに検索 適当な店舗の座標を中心に半径5km で検索 > db.stores.find({loc: {$near: { $geometry: { type: "Point", coordinates : [139.3553166, 35.557722]}, $maxDistance : 5000 }}}) { "_id" : ObjectId("542bb40d7072491a6a49335d"), "type" : "node", "id" : 277208310, "tags" : { "amenity" : "fast_food", "brand" : " 松屋", "name" : " 松屋", "name:en" : "Matsuya", "name:ja" : " 松屋", "name:ja_rm" : "Matsuya", "source" : "survey" }, "loc" : { "type" : "Point", "coordinates" : [ 139.3553166, 35.5577222 ] } } { "_id" : ObjectId("542bb40d7072491a6a4933c9"), "type" : "node", "id" : 1682557982, "tags" : { "amenity" : "fast_food", "branch" : " 相模原店", "brand" : " 松屋", "cuisine" : "gyudon", "name" : " 松屋", "name:en" : "Matsuya", "name:ja" : " 松屋", "name:ja_rm" : "Matsuya", "wheelchair" : "no" }, "loc" : { "type" : "Point", "coordinates" : [ 139.3700845, 35.5805666 ] } } ...
  • 31. アプリ側の話 Ruby + Sinatra + mongo(*) + bson_ext ERB にJavascript 埋めてOpenLayers を利用 入力された地点情報でOverpass API 引いて緯度 経度情報を得て、MongoDB に問い合わせ その結果をOpenLayers でプロット (*) MongoDB のRuby 標準ドライバー
  • 32. 画面例 ここに中心点を 入力して 検索 OpenLayers による OSM 地図描画 MongoDB への クエリー文字列
  • 33. つまらない工夫など OSM のPOI は「東京駅」の場合、name:" 東京" 、 railways:"station" とかになってる 「駅」で終わる文字列は加工して検索 Ruby の配列( =MongoDB のクエリ結果)をERB 上のJavascript に渡したい ERB で変数展開してJS の配列に代入し直せばOK
  • 34. 謎?? Overpass API に手でクエリ投げると通るのに、Ruby からだとダメな時があって??? すみません未解決です……。
  • 35. 所感(1) シェルでJS 叩いてゴニョゴニョできるMongoDB は データをいじくりまわしながら考えるときにヨイ! シャーディングもレプリカセットもなくても、MongoDB を 使うと嬉しい状況はいっぱいあるよ! パイロットデータをいじりながら考えたいときとか 今回の応用だとOSM データのメタデータ参照エンジン として使うのもいいのでは
  • 36. 所感(2) 今回ぐらいの規模ならRuby + Sinatra Good! Model の合計147 行、View 88 行 覚えることが少ないのはハッピー OpenLayeres は割とわかりやすかったし楽しい このサイト↓入門によかった http://openstreetmap.piyolab.net/mapbyopenlayers.php
  • 37. まとめ MongoDB の地理空間検索機能とOpenStreetMap の情報を作って、地図情報検索アプリを書いてみた 考えながら作るときにはMongoDB サイコー 地理空間検索楽しい OSM は色々いじれそうでこの組み合わせは遊べる 地図ならGoogle Map という思い込みはやめよう!
  • 38. Happy MongoDB & OpenStreetMap Life!