2012年8月21日火曜日

都道府県や市町村で色分けができる地図APIをまとめてみた はてなブックマークに追加

ジオメディアサミット名古屋で簡単に統計情報を地図上で色分けして公開することができるGeoFUSEのデモが印象に残り、仕事でも使えるかと思いGeoFUSEを調べてみたところ、GoogleやYahooでも統計情報を地図上で色分けする方法があるようです。

 今後使うときの参考になるように、それぞれのメリットでメリットをまとめてみようと思います。
世界 都道府県 市町村 CSV読み込み 商用利用 イントラで利用できるか データの鮮度(市町村合併)
Geo FUSE ? X
Yahoo!スタティックマップAPI X X ? X
Yahoo! JavaScriptマップAPI X X ? X ?
Google Fusion Table X ?X-
Google Chart API XX ? X -
Map of Japan X X X ? -
今夜は地図APIの星取り表の項目を作って燃え尽きました。明日以降は星取り表の各項目の調査とAPIの使いかたをまとめてみます。 つづく。。。。

市町村データの鮮度

Geo FUSE

熊本市の市町村合併(2012/4/1)は対応していませんでした。

NG例
city,ID,code
熊本県熊本市中央区,1,43101
熊本県熊本市東区,2,43102
熊本県熊本市西区,3,43103
熊本県熊本市南区,4,43104
熊本県熊本市北区,5,43105

OK例
 city,ID,code
熊本県熊本市,1,43201


Yahoo!スタティックマップAPI

 熊本市の市町村合併(2012/4/1)対応済み

Yahoo! JavaScriptマップAPI

熊本市の市町村合併(2012/4/1)対応済み

参考ドキュメント

GDALを使ってGoogle Fusion Tablesにshpファイルを保存する方法




2011年9月20日火曜日

dbfファイルの文字コード変換 はてなブックマークに追加

国勢調査の結果がshapeファイルで取得できることを知ってダウンロードしたんですが当然ながらsjisで(市町村単位でしかダウンロードできないのでそこも困ったけど)、Webサービス的に使おうとするとshapeのままだと不便なので早速変換したのですが、PostgreSQLで扱う場合はshp2pgsqlだと入力ファイルの文字コードの指定ができるけど、ogr2ogrでは、入力ファイルの文字コードの指定ができないので、dbfファイルをutf-8にしてしまえと、バッチで変換するスクリプトを書いてみた。

dbfの操作は、dbfpyを利用しました。

  • 国勢調査のshapeしかテストしていないので、未知の型だと動かないかも
  • sjisじゃない文字列だとエラーになりました。
  • 最大文字列長ではなく、フィールド定義の文字列数を2倍にしてます。ファイルサイズが気になる方は、先に一回全レコードを走査して最大文字列長を取るといいと思います。
  • マイクロソフト版Shift_jis拡張文字コードのcp932を指定



  1. #!/usr/bin/env python  
  2. # -*- coding: utf-8 -*-  
  3. from dbfpy import dbf  
  4. import os,sys,shutil  
  5. #http://dbfpy.sourceforge.net/  
  6.   
  7. def convertDbf(dname):  
  8.     #バックアップの作成  
  9.     nname = dname[:-4]+".bk"+dname[-4:]  
  10.     shutil.move(dname,nname)  
  11.     db = dbf.Dbf(nname)  
  12.     bfh = dbf.Dbf(dname, new=True)  
  13.   
  14.     #header の作成  
  15.     for f in db.fieldDefs:  
  16.         (name , type,len,dec) =  f.fieldInfo()  
  17.         print f  
  18. #     KEY_CODE    C  11   0  
  19. #     SETAI    N  10   0  
  20. #    X_CODE    N  19   5  
  21.         if type == "C":  
  22.             bfh.addField((name, type, len*2))  
  23.         if type == "N":  
  24.             bfh.addField((name,"N", len, dec))  
  25.         else:  
  26.             bfh.addField((name, type, len))  
  27.   
  28.     #data のコピーと文字コード変換  
  29.     for rec in db:  
  30.         n = bfh.newRecord()  
  31.         for f in db.fieldDefs:  
  32.             (name , type,len,dec) =  f.fieldInfo()  
  33.             if type == "C":  
  34.                 n[name] =  unicode(rec[name],"cp932").encode('utf-8')  
  35.             else:  
  36.                 n[name] =  rec[name]  
  37.   
  38.         n.store()  
  39.     bfh.close()  
  40. #############  
  41.   
  42. for f in os.listdir(os.getcwd()):  
  43.      if os.path.isfile(f) == True and f[-3:] == "dbf":  
  44.          print f  
  45.          convertDbf(f)  


合わせて読む
ogr2ogrでshpefileをKML化
娘のサンプルだとKML化後に文字コード変換しているので、事前に変換しておくとよいかも

2011年1月28日金曜日

picasawebにも画像を投稿してみる。 はてなブックマークに追加

Google Baseを試す必要があったので、勉強代わりにPicasa Web Albums Data APIに画像をアップしてみた。

認証ができているかどうかのテストなので適当です。アップ時にメタ情報も登録できるけど、XMLと画像を同時アップが結構手間なのではしょっちゃいました。

  1. 事前に picasawebでアップ用のアルバムの作成と、API Keyの取得が必要です。
  2. albumidは、アルバム情報取得APIできますが、面倒でしたらアルバムページのRSSのURLから抽出できます。
  3.  gbaseのpythonライブラリは、今回は調査がメインだったので使っていません。


  1. #!/usr/bin/python  
  2. # -*- coding: utf-8 -*-  
  3. import urllib  
  4. import urllib2  
  5.   
  6. #http://code.google.com/intl/ja/apis/accounts/docs/AuthForInstalledApps.html  
  7. #http://code.google.com/intl/ja/apis/picasaweb/docs/2.0/developers_guide_protocol.html#PostPhotos  
  8. #コマンドラインからの認証  
  9. url = 'https://www.google.com/accounts/ClientLogin'  
  10. #picasaweb の service は lh2 それ以外は適宜  
  11. params = urllib.urlencode({'Email':"YOUR_MAIL_ADDRESS"'Passwd':"YOUR_PASSWD","service":"lh2","accountType":"HOSTED_OR_GOOGLE","source":"YOUR_APP_NAME_AND_VERSION"})  
  12. f = urllib.urlopen(url, params)  
  13. r = f.read().split("\n")[2]  
  14. #responce SID,LSIDは不要,Authのみ取得する  
  15. Auth = r.split("=")[1]  
  16.   
  17. #画像を開く  
  18. i = open("/Volumes/hd1/Users/nishiokya/Pictures/shoebill.jpg","r");  
  19. img = i.read()  
  20.   
  21. #user と albumidが必要  
  22. url = 'https://picasaweb.google.com/data/feed/api/user/nishiokya/albumid/5304381279593343265'  
  23. req = urllib2.Request(url)  
  24. req.add_header("Content-Type"," image/jpeg")  
  25. req.add_header("Content-Length",len(img))  
  26. req.add_header("Slug","shoebill.jpg")  
  27. req.add_header("Authorization","GoogleLogin  auth="+Auth)  
  28. #google no appid   
  29. #http://code.google.com/intl/ja/apis/base/signup.html  
  30. #Installed applications にチェック  
  31. req.add_header("key","ABQIAAAAp2K6l3b04u-NrzcaeIej-BT2yXp_ZAY8_ufC3CFXhHIE1NvwkxXXXXXXXXXXXXXXXXXXXX")  
  32. req.add_data(img )  
  33.   
  34. try:  
  35.    resp = urllib2.urlopen(req)  
  36.    print resp.code   
  37.    print resp.info()  
  38.    print resp.read()  
  39. except urllib2.HTTPError, e:  
  40.    print "Error: %s" % e  
  41.    print e.read()  

2010年8月18日水曜日

地図と測量の科学館 はてなブックマークに追加

地図と測量の科学館


家族で筑波山に登ったんですが、あいにくの天気でした。山頂周辺はガスが凄くて視界が全くないので、全く盛り上がらず早めに切り上げ、筑波市街にある国土地理院に併設されている地図と測量の科学館に行って参りました。




 
看板

前の仕事が測量会社だったので、なんかの研修で国土地理院内と地図と測量の科学館ともに行ったことがあるんですが、もう10年くらい前なので何にも覚えてなくて新鮮でした。仕事で行くのとプライベートで行くので感じ方が違うのかもしれません。


表から見た建物
思ったより小さい


ちきゅう広場 日本の地図がありました
直径22mもある日本列島の模型です。日本は平面じゃないことを実感できます。やはり距離の計算には球面として計算しないと。。。




地図と測量の科学館の背面

建物を後ろから取りました、真夏なのであまり外を歩いている人はいません。


測量写真用の飛行機
地図は飛行機で取るんですよね。特別展示室でこの飛行機の展示をやっていました。




ベハイムの地球儀(1492)のレプリカ


立体視ができるTV


子供が昔の測量器械を覗き込んでいます


子供も興味がなかったのですが、入ってみると楽しかったようで2時間近く遊んでいました。無料で教育にもなりそうなミュージアムで、家族一同大満足でした。

■ 住所 〒305-0811 茨城県つくば市北郷1番 国土地理院
■ Tel. 029-864-1872
■ Fax. 029-864-3729
■ 開館時間:午前9時30分〜午後4時30分
■ 休館日:毎週月曜日(休日の時は順次翌日)、年末年始(12月28日〜1月3日)
■ 入館料:無料
■ Site : http://www.gsi.go.jp/MUSEUM/

2010年3月13日土曜日

サントリーホール オープンハウス はてなブックマークに追加

サントリーホールオープンハウスが3月末にあります。去年に子供と一緒に行ったのですが、一日音楽を聴いたり遊んだりととても楽しかった印象があるので今年もいってこようと思います。

去年取った写真の整理と備忘録をかねてエントリーしておきます。

DSCN1210
ホール内の会場
前の方に座っていると、大学のオーケストラを相手に指揮をすることができるかも?

サントリーホールオープンハウス
女の子の指揮
指揮棒がおもちゃの杖でした。


DSCN1211
男の子の指揮
小さいですが、ヴァイオリンを習っているそうで様になっています。

サントリーホールオープンハウス
趣味 オケ
趣味が指揮マネの方が登場(指揮マネとはオーケストラのCDを聴きながら指揮者の真似をすることらしいです、初めて聴きました)ということで、ノリノリで大盛り上がり!

サントリーホールオープンハウス
パイプオルガン
パイプオルガンの演奏もありました。

DSCN1227
会場の内外で子供向けのイベント
会場内では、スタンプラリーやクイズ、外でもいろいろな催し物があり一日中楽しめました。

開催概要
日時 2010年3月28日(日) 10:00〜16:00
料金 入場無料(出入自由)
主催 サントリーホール
後援 港区
お問合せ サントリーホールチケットセンター 03-3584-9999

■特別公開!オーケストラのステージ・セッティング〜公開リハーサル
■オーケストラ・コンサート (指揮:大河内雅彦、演奏:慶應義塾ワグネル・ソサィエティー・オーケストラ)
■オルガン・コンサート (演奏:浅井美紀)
■ステージにあがろう!
■みんなでクイズ「ドレミファ・ポン♪」
■オペラ名曲コンサート(出演:清水知子、山口佳子、今尾滋、古藤田みゆき、他)
■ホール de おんがくテーリング
■チャリティ朝市
■ホール・ガイドツアー
■音楽カフェ
■写真展


http://www.suntory.co.jp/suntoryhall/sponsor/100328.html

2010年3月7日日曜日

flickr apiで iPhoneの撮影角度を補正するPythonスクリプト はてなブックマークに追加

夏にiPhone3GSを買ってGeoTag付きデジカメ2台体制で日々GeoTagに個人情報だだ漏れさせた画像をflickrにアップしておりますが、Nikon COOLPIXP6000と違いiPhoneには撮影角度情報があってその情報を利用すれば、手動で写真の回転する作業から解放されるので早速Pythonで角度を回転するするスクリプトを書いてみました。


pythonスクリプトの説明
1.画像の回転は認証が必要なので確認する。
2.3日以前に投稿した写真を400枚取得する
3.画像のIDからexifデータを取得する
4.exifから”Orientation”を探す。
5.文字列から撮影角度を取得し、画像を回転させる。

ちなみにExifの”Orientation”のパターンは8種類あるようですが、iPhone3GSでは4つしか出てこないようなので対応していません。”Orientation”パターンを探している方や、iPhone3GS以外も対応したい場合は、Exif Orientationタグによる補正方法 - オレBlogさんの情報が参考になるとおもいます。

%orientation = (
1 => 'Horizontal (normal)',
2 => 'Mirror horizontal',
3 => 'Rotate 180',
4 => 'Mirror vertical',
5 => 'Mirror horizontal and rotate 270 CW',
6 => 'Rotate 90 CW',
7 => 'Mirror horizontal and rotate 90 CW',
8 => 'Rotate 270 CW',
);

Exif Orientationタグによる補正方法 - オレBlog


  1. # coding: UTF-8  
  2. import flickrapi  
  3. import re  
  4. import time  
  5.   
  6. api_key = 'xxxxxxx'  
  7. secret_key = 'yyyyyy'  
  8. my_id = 'zzzz@N00'  
  9.   
  10. flickr = flickrapi.FlickrAPI(api_key,secret_key)  
  11. #auth  
  12. (token, frob) = flickr.get_token_part_one(perms='write')  
  13. if not token: raw_input("Press ENTER after you authorized this program")  
  14. flickr.get_token_part_two((token, frob))  
  15.   
  16. mt =  int(time.time()-24*60*60*3)  
  17. search = flickr.photos_search(user_id=my_id,min_upload_date=mt,per_page=400,page=1)  
  18.   
  19. for photo in search.find("photos").findall('photo'):  
  20.     photoid  = photo.attrib['id']  
  21.     getexif = flickr.photos_getExif(photo_id = photoid )  
  22.     e= getexif.find("photo").findall('exif')  
  23.     if( e):  
  24.       try:  
  25.         rot =  ""  
  26.         print photoid + " " + photo.attrib['title']  
  27.         for exif in e:  
  28.             label = exif.attrib["label"]  
  29.             if( label == 'Orientation' ):  
  30.                 rot =  exif.find("raw").text  
  31.         if rot == "Rotate 90 CW":  
  32.             flickr.photos_transform_rotate(photo_id = photoid,degrees = 90)  
  33.         elif rot == "Rotate 270 CW":  
  34.             flickr.photos_transform_rotate(photo_id = photoid,degrees = 270 )  
  35.         elif rot == "Rotate 180":  
  36.             flickr.photos_transform_rotate(photo_id = photoid,degrees = 180)  
  37.         elif  rot == 'Horizontal (normal)':  
  38.             pass  
  39.   
  40.       except AttributeError:  
  41.           print "error"  
  42.           continue  
  43.       except FlickrError:  
  44.           print "error"  
  45.           continue  

※エラーがあっても無視するようにしてます。
※Macの場合はiPhotoだと取り込んだ時点で自動で画像の回転し、そのうえにFlickrへの投稿ボタンまで用意されているので、自作スクリプトで対応する必要はないのですが、中途半端に自作スクリプトに自分専用の便利機能をつけてしまったのでiPhoto移行できずに日々車輪の再発明を続けております。

2009年11月8日日曜日

cycle-ringに投稿 はてなブックマークに追加

cycle-ringに投稿したのがブログバーツにはれるらしいので試してみます。



北千住 [サイクリング記録] - Cycle-Ring(サイクルリング)