SHAPE > PostGIS > Solr > Google Map
国土交通省のデータをSolrで検索株 式 会 社 ネ ク ス ト 秀 野 亮@ r y o 0 3 0 1
View Slide
自己紹介秀野 亮株式会社ネクスト@ryo0301不動産・住宅情報サイト HOME'Shttp://www.homes.co.jp/最近の仕事Solr -> AWS -> DQ10
発表の概要Lucene/Solr4の新しい(地理)空間検索 http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4上記の機能を使ったデモとその説明国交省のデータ -> PostGIS -> Solr
デモ:想定した機能地図上の小学校から、その学区内の物件を検索小学校をクリック学区を表示学区内の物件を表示地図上の指定した範囲の物件を検索おまけ内部的には同じ機能
デモ:環境バージョン(5月時点の最新版)Solr4.3.0PostGIS2.0.3データ東京都のデータPOLYGON:学区POINT:小学校、公園、公共施設、バス停※物件代わりに利用
デモ:やります少々お待ちください
デモ:実演中…
事前知識説明の前に軽く事前知識を・・・
事前知識:ジオメトリデータ点:駅/物件などPOINTMULTIPOINT線:路線などLINESTRINGMULTILINESTRING面:市区町村/学区などPOLYGONMULTIPOLYGON
事前知識:WKB/WKT形式WKBWell Known Binary0101000000000000000000F03F000000000000F03FPostgreSQL(PostGIS)にはWKB形式で格納WKTWell Known TextMULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((55,7 5,7 7,5 7, 5 5)))Solrへのインポート、検索クエリはWKT形式で行う
事前知識:IntersectsIntersects交差するデータを検索する関数
環境:データの流れ&$TIQQHTRM1PTU(*4 HFPNLNM LNMT 44PMS%*)ࠃަল
環境:SHAPE -> PostGIS&$TIQQHTRM1PTU(*4 HFPNLNM LNMT 44PMS%*)ࠃަল
環境:SHAPE -> PostGIS国土交通省のデータを使って、緯度経度から市区町村までを取り出す http://qiita.com/masuidrive/items/21a282c7bf54fd6a4985
環境:PostGIS -> Solr&$TIQQHTRM1PTU(*4 HFPNLNM LNMT 44PMS%*)ࠃަল
環境:PostGIS -> SolrPostGIS -> DIHDIHでDBから一括インポートselect *, ST_AsText(geom) from school_district;ST_AsText関数でWKB→WKT変換DIH -> SolrSpatialRecursivePrefixTreeFieldTypegeohashで階層的にインデックスを保持WKT形式でインポート
環境:PostGIS -> Solrschema.xmlspatialContextFactory="com.spatial4j.core.context.jts.JtsSpatialContextFactory"distErrPct="0.025" maxDistErr="0.000009" units="degrees"/>
環境:PostGIS -> S3&$TIQQHTRM1PTU(*4 HFPNLNM LNMT 44PMS%*)ࠃަল
環境:PostGIS -> S3geom2kmlselect ST_AsKml(geom) from school_district;ST_AsKml関数でKML形式に変換ERBでKMLファイルを生成MULTIPOLYGONデータ(学区)が対象kml2s3KMLファイルをAmazon S3にアップロード
環境:PostGIS -> S3ST_AsKml関数の出力結果(MULTIPOLYGON)>139.763459000000012,35.6...139.763459000000012,35.663246999999998LinearRing>
環境:Solr/S3 -> Google Map&$TIQQHTRM1PTU(*4 HFPNLNM LNMT 44PMS%*)ࠃަল
環境:Solr/S3 -> Google MapKmlLayer学区の範囲をGoogleMap上に表示S3上のKMLファイルのURLを指定するだけSolrでの検索小学校検索 (geo:[10,20 TO 30,40])小学校→学区検索 (POINT→MULTIPOLYGON)学区→物件検索 (MULTIPOLYGON→POINT)指定範囲検索 (POLYGON→POINT)
実際のクエリ小学校→学区検索 (POINT→MULTIPOLYGON)fq=geo:"Intersects(POINT(139.7343+35.6364))"学区→物件検索 (MULTIPOLYGON→POINT)fq=geo:"Intersects(MULTIPOLYGON(((139.73720235.640305,139.737358 35.640414,...305))))"※geoフィールドに対して検索
注意点:必要なライブラリSpatial4Jhttps://github.com/spatial4j/spatial4jgeospatialJTShttp://sourceforge.net/projects/jts-topo-suite/spatialpolygon support
注意点:必要なライブラリSolr adaptersLucene spatialSpatial4JJTS
注意点:インデクシング遅いMULTIPOLYGONのインデクシングが遅い驚きの遅さPostGISに間引きしてくれる関数があったような…
EOPありがとうございました。
蛇足ネクストでは、ヌルスタックエンジニアを募集しています!