ラベル gis の投稿を表示しています。 すべての投稿を表示
ラベル gis の投稿を表示しています。 すべての投稿を表示

2014年1月11日土曜日

国交省国土数値情報JPGIS2.1対応

何だか知らないですけど国交省が公開してくれてる国土数値情報(行政区域)のJPGIS2.1版ってデータおかしくないっすか?って問い合わせメール出したら数日もたってようやくテンプレメールしか返ってこなかったでござる。

しかも人の名前も間違えて。
おこだよ?

おかしいといっても、北海道のデータで支庁が同一のコードを持つ市にもかかわらず設定されていたりされてなかったりとまちまちで、なにこれ?っていう指摘なんですけどね。

支庁というか、開発局だっけ、それは住所としては不要なんで結論からするとどうでもいいんですけど、ふつう辞書からコードで引き当てて文字を割り当てるはずのものでしょ。

それが抜けてたり埋めてあったりするということは、それを引き当てるプログラムに障害があるということだし、完成したデータも満足にチェックしてないってことですよね。

っていうメール。

ついでに引き当ててくる元辞書が名前だけで実体がどこにも公開されてないよ、っていう指摘もしたんですけどこっちはガン無視。(JPGIS1.0版は公開されてるんですけどね)
たぶんメールを最後まで読んでないからだと思うけど。
忙しいだろうからしょうがないね。
返事が来るだけでもエライ。

ということで、JPGIS1.0と2.1の両方に対応しました。
といっても、もう1.0版は数年出てないしこれからも出ないと思いますが・・・

それにしても2.1版は1.0版に比べて解析時の負荷が小さくていいね。
ていうか、XMLである必要がないところまで単純化してあるんだからCSVでいいとおもうんだけど。。。
というより、仕様書さえしっかりしているならバイナリでもいいけど。
(なんか知らないけど2.1版ではポリゴンは改行コードに依存してるし。)
まあ、javaとかphpとかjavascriptしか知らないような人にも簡単に扱えるとか、最近のRDBはXMLをそのまま放り込めたりしたりして、ユーザ層の拡大につながるし、行政界なんてリアルタイムを求めるわけじゃないんだからプアな環境で使うなら前処理しておけばいいだけですからね。とにかくこういうデータを公開してくれて重ねて感謝。

ただ、いくらGIS業界標準とかいってもshapeデータ同梱はどうかと思う。
作ってくれること自体は実に有意義であることに異論はないんだけど、GIS業界関係者だけで使うデータじゃないんだし、そもそもshapeデータは2次生成物なんだから、別途配布するほうが自然だとおもうなあ。

それでもやっぱり感謝の念は変わりません。
やっぱり税金使ってごにょごにょやったとき、こういうのできました、っていう成果物を公開できる範囲内で積極的に公開してもらえると納税者としては素直にうれしいです。

それにしても、google app engineの静的リソース容量の制限、もうちょっと緩和されればもっと早くなるんだけど・・・
今でもミリ秒単位で、インスタンスの起動時間よりよっぽど早いけど、もっと高速化できるのにリソースとして置いておくことができなくて残念。

2013年12月14日土曜日

地図上に点を打って簡単なポリゴンを作りたい

表題のようなことをしたいなあ、という人はあまりいないかもしれませんが、ここに一人いたので実際にやってみました。

ポリゴンといってもそんな大げさなものではなくて、たとえば大雑把な地図上の地点をクリックしていって経緯度のリストができていれば、それは立派なポリゴンになるわけです。

で、特殊なソフトも入れたくないし、立派な地図も買うほどのものじゃない・・・というときにお役立ちなのが我が国の政府からは利用が制限されているgoogle mapさん。

なにが有用かというと、国内でいうと地図だけならゼンリンさんですが、google mapさん経由で閲覧する以上、プラスアルファがあるわけです。

Google Maps JavaScript API v3 (以下API)が利用できるため、地図とAPIを組み合わせるだけで、目的のものがいともたやすくできてしまいます。

政治上の信念や主張も大切ですが、ここはポリゴンのためです。政府職員でも何でもないわたくしはありがたく使わせていただきましょう。

で、APIなんか使わなくても、もともと特定地点の経緯度は特定の操作をすればすぐわかるようになっています。
ですが、その特定の操作が、連続して経緯度を得るにはちょっと根気がいる作業になってしまうという欠点があります。

そこで、真のプログラマたるもの、楽をしたいならどんな面倒なことでもやる。。。というほどのこともなく、この場合、面倒なことは一切ありません。
ちょっとブラウザ上で動くスクリプトを書けばいいだけで済んでしまいます。APIが整備されているおかげです。

しかも、このAPI、利用するためにgoogleさんに登録の必要がないというすさまじい太っ腹ぶり。シビれますね。
コードを書いたその瞬間からhttpをしゃべるサーバを立てることなく、ブラウザでローカルファイルとして作成したhtmlファイルを表示させてスクリプトを動かすだけで利用できてしまうという点でも助かります。
(「誰でも自由にアクセスできるウェブサイトであれば、無料で利用できるサービスです。」とありますが、さすがにコードを書いてる途中から公開できるわけがなく、ローカルで手軽にテストできるのがうれしいですね)

要点は非常に簡単。それこそその辺のサンプルを拾ってきて(本家のも含めて山ほどあります)、ともかくgoogle mapを表示するってな感じのスクリプトをまずhtmlファイルに追加します。

その時点でもう地図が画面上に表示できているはずです。

アトはもう簡単。クリックされたときに呼ばれるリスナを登録してあげるところだけがミソです。

たとえば

 map = new google.maps.Map(document.getElementById("地図表示領域"), mapOptions);

としてmapオブジェクトを作ってあったとすれば、イベントリスナとして

google.maps.event.addListener(map, 'click', function(event) {
   func(event.latLng );
});

のようにしてあげると(このjava記法ほんとダイキライ。javascriptトカjavaノトキケッキョクツカッチャウケド)、経緯度がfunc()に渡るのであとはどうでも好きにすればいいわけです。
※念のため、funcはAPIじゃないですよ、自分で定義した関数です。

どこをクリックしたのかわかりやすいようにマーカを表示させ、さらにリスナに渡されるオブジェクトのメンバに経緯度が入っているので、それをどこかに用意した要素(たとえばdiv部など)に

document.getElementById("point_list").innerHTML += location.lat() + "," + location.lng() + "<br/>"

のように追加していくだけで十分メタツールになりえます。

ポリゴンが完成したら、その要素からテキストをコピーすればいいわけです。

凝ろうと思えばいくらでも凝れる、一昔前ではまるで夢物語のような高性能アプリの雛形が、回線インフラと膨大な地図データとAPI(とインフレなPC性能)のおかげでたったの数十行でできてしまいます。

まさにネットウラシマを実感する瞬間です。

2013年12月10日火曜日

経緯度から市区町村名を得たい

googleさんとかのオンラインサービスに頼らず自力で。

実際にやってみました。
国交省さんが公開している国土数値情報 行政区域データというのがおじゃる。
これ、よくできているなあ、と感心したのは、経緯度から市区町村名を得たい、という目的の場合、saxでも後方参照だけで面データに紐づいている市区町村名がわかるようにできていること。
あと、国土地理院みたいな半端なデータじゃなくてちゃんと水界とかも加味して"行政界として"ポリゴンが完結していること。

地味にありがたいよ、これ。

ご丁寧に始点と終点がreferenceになっていて間違いようがないように作ってある。そのreferenceも前方でまとめて定義してあるので、前方参照する手間がない。
実に助かる!

逆に言えば市区町村名から面を得ようとするとsaxでは前方参照が起こってしまうのですが。

saxにこだわるのは、パースしている状況をintな変数1つ+さっき見た要素の値だけで遷移させられるから。
確かに現在どういうことをやっているのかをしっかり管理しないといけないデメリットはありますが、メモリを大幅に節約できることはとても大きい。とくに組み込み機器向けには。
DOM作ったりxpath式で自由自在に取り出すのも結構だけど、それってちょっとリッチ杉。
日本の市区町村って2000近いもんねぇ。

というわけで、とにかく面白くてandroidでapk経由でデータを持ち込んでgoogle apiを使わないで市区町村名を得るアプリを書いてみたのですが・・・動くんだけど、元ネタファイルがデカすぎてapk形式ではもちづらいんですよねぇ。

assetsに格納してもeclipseさん激おこだし・・・

別個にダウンロードする形式にすれば・・・とか言い出すと、だったら最初から鯖/蔵でいいよねと。

いつ何時有料化されたり打ち切りになってしまうかわからないサービスを利用するのもコワイんで、ある程度自力でやりたいのですが、肝心の「ある程度」ってのをファイルサイズ的に痛烈に超過してしまっているので存在意義がないレベルまで落ちてしまう。

実際の処理としては本当に単純で、あらかじめ雑なふるい分けのために県単位での矩形を求めておけば47都道府県全部を検索する必要もなく、国外はそもそも検索する必要がない。処理時間としてはあっという間に終わってしまうCPUパワーを携帯ですら持ってる。

ただ結局市区町村を自力で特定するためには膨大なサイズのxmlをどうにかする必要があって、それをバイナリ化するなり自分で工夫する必要が出てきてしまう。
ここで急に一般化できなくなる。
国交省の作った最新ファイルで置き換えれば市町村合併にだってへっちゃら!なんてことができなくなっちゃう。
独自の変換用フィルタをかませるひつようがあるからねぇ。

結局現実的な対応としてはどっかからサーバと回線調達してきてユーザに必要な都度クエリを投げてもらう、というどっかで見たようなところに落ち着くんですかねぇ。

実は、どいつもこいつも時計の見た目やいい加減な予報(ほとんど曇りとかなんだよそれ。直訳すぎだろ。しかも台風来てても曇りだとか抜かすし)が気に入らないから、自分で時刻・天気予報(ちゃんと気象庁の)・スケジュール(ないけどね)をロックスクリーンに出すandroid向けwidgetを作っていて、できているんだけど、予報地域を手動で設定するより自動がかっこいいよね、と思って作ったらGISデータのほうがむちゃくちゃ大きくなって困ったなあ、ってだけなんですけどね。

実際に動いてはいるんだけど、これじゃ公開もできないよなぁ。
ま、需要はない気もするけど。
あればだれかがとっくに作ってるよね。

自己満足、自己満足。