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を指定



#!/usr/bin/env python
# -*- coding: utf-8 -*-
from dbfpy import dbf
import os,sys,shutil
#http://dbfpy.sourceforge.net/

def convertDbf(dname):
    #バックアップの作成
    nname = dname[:-4]+".bk"+dname[-4:]
    shutil.move(dname,nname)
    db = dbf.Dbf(nname)
    bfh = dbf.Dbf(dname, new=True)

    #header の作成
    for f in db.fieldDefs:
        (name , type,len,dec) =  f.fieldInfo()
        print f
#     KEY_CODE    C  11   0
#     SETAI    N  10   0
#    X_CODE    N  19   5
        if type == "C":
            bfh.addField((name, type, len*2))
        if type == "N":
            bfh.addField((name,"N", len, dec))
        else:
            bfh.addField((name, type, len))

    #data のコピーと文字コード変換
    for rec in db:
        n = bfh.newRecord()
        for f in db.fieldDefs:
            (name , type,len,dec) =  f.fieldInfo()
            if type == "C":
                n[name] =  unicode(rec[name],"cp932").encode('utf-8')
            else:
                n[name] =  rec[name]

        n.store()
    bfh.close()
#############

for f in os.listdir(os.getcwd()):
     if os.path.isfile(f) == True and f[-3:] == "dbf":
         print f
         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ライブラリは、今回は調査がメインだったので使っていません。


#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib
import urllib2

#http://code.google.com/intl/ja/apis/accounts/docs/AuthForInstalledApps.html
#http://code.google.com/intl/ja/apis/picasaweb/docs/2.0/developers_guide_protocol.html#PostPhotos
#コマンドラインからの認証
url = 'https://www.google.com/accounts/ClientLogin'
#picasaweb の service は lh2 それ以外は適宜
params = urllib.urlencode({'Email':"YOUR_MAIL_ADDRESS", 'Passwd':"YOUR_PASSWD","service":"lh2","accountType":"HOSTED_OR_GOOGLE","source":"YOUR_APP_NAME_AND_VERSION"})
f = urllib.urlopen(url, params)
r = f.read().split("\n")[2]
#responce SID,LSIDは不要,Authのみ取得する
Auth = r.split("=")[1]

#画像を開く
i = open("/Volumes/hd1/Users/nishiokya/Pictures/shoebill.jpg","r");
img = i.read()

#user と albumidが必要
url = 'https://picasaweb.google.com/data/feed/api/user/nishiokya/albumid/5304381279593343265'
req = urllib2.Request(url)
req.add_header("Content-Type"," image/jpeg")
req.add_header("Content-Length",len(img))
req.add_header("Slug","shoebill.jpg")
req.add_header("Authorization","GoogleLogin  auth="+Auth)
#google no appid 
#http://code.google.com/intl/ja/apis/base/signup.html
#Installed applications にチェック
req.add_header("key","ABQIAAAAp2K6l3b04u-NrzcaeIej-BT2yXp_ZAY8_ufC3CFXhHIE1NvwkxXXXXXXXXXXXXXXXXXXXX")
req.add_data(img )

try:
   resp = urllib2.urlopen(req)
   print resp.code 
   print resp.info()
   print resp.read()
except urllib2.HTTPError, e:
   print "Error: %s" % e
   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



# coding: UTF-8
import flickrapi
import re
import time

api_key = 'xxxxxxx'
secret_key = 'yyyyyy'
my_id = 'zzzz@N00'

flickr = flickrapi.FlickrAPI(api_key,secret_key)
#auth
(token, frob) = flickr.get_token_part_one(perms='write')
if not token: raw_input("Press ENTER after you authorized this program")
flickr.get_token_part_two((token, frob))

mt = int(time.time()-24*60*60*3)
search = flickr.photos_search(user_id=my_id,min_upload_date=mt,per_page=400,page=1)

for photo in search.find("photos").findall('photo'):
photoid = photo.attrib['id']
getexif = flickr.photos_getExif(photo_id = photoid )
e= getexif.find("photo").findall('exif')
if( e):
try:
rot = ""
print photoid + " " + photo.attrib['title']
for exif in e:
label = exif.attrib["label"]
if( label == 'Orientation' ):
rot = exif.find("raw").text
if rot == "Rotate 90 CW":
flickr.photos_transform_rotate(photo_id = photoid,degrees = 90)
elif rot == "Rotate 270 CW":
flickr.photos_transform_rotate(photo_id = photoid,degrees = 270 )
elif rot == "Rotate 180":
flickr.photos_transform_rotate(photo_id = photoid,degrees = 180)
elif rot == 'Horizontal (normal)':
pass

except AttributeError:
print "error"
continue
except FlickrError:
print "error"
continue



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

2009年11月8日日曜日

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

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



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

2009年11月1日日曜日

Mashup Award 5に挑戦しました はてなブックマークに追加


Mashup Award 5に以前からGeoPlanet APIのサンプルを作っていたアプリを修正して申し込みました。


Loclink
見ての通り地域情報のカテゴリサイトなので説明はなくてもわかると思います

元々はGoogle App Engine上にGeoPlanet Dataを親子関係をベースにリスティングして周辺の画像を集めたものでしたが、思いのほかGoogle App Engineの性能が良いためいろいろ盛り込んでいました。ちょうどMashup Award 5 が始まりいい機会なのでいろいろなジオ系APIを組み込み、カテゴリをアグリゲートした形の地域情報サイトとして模様替えし応募してみました。

売りとしては、GeoPlanet APIが持つ空間関係を補強するために事前にWikipediaやYahoo検索、ブログといったデータをクロールしてキーワードごとにインデックスを作成したことです。これにより今までのの位置情報関係では気づかなかった、離れた地域同士で関連を探せることをめざしました。

Google App EngineのBig Tableのテストという意味では本来の目的は達しましたが、Google App Engineは面白い機能がいろいろありますので、まだまだ手を加えてみたいと思います。

Loclink


関連記事

GeoPlanetについて
GeoPlanetのPlaceType一覧
GeoPlanetのPlaceType一覧 その2

2009年8月24日月曜日

ogr2ogrでshpefileをKML化 はてなブックマークに追加



今日の作業めも


調べごとがあったので、こちらのサイトを参考に国土数値情報の駅データを、gdalという地図画像ライブラリのユーティリティであるogr2ogrを利用して同一名称の駅毎のKMLファイルに出力してみました。


1. 駅名リストの抽出
ogr2ogr -f csv stnlist.txt N02-08_EB03.shp -select STN

駅名のシードデータを作るため、shapeファイルからSTNフィールドのみをCVSに出力しました。

2. 同じ駅名を連番のkmlに変換
cat stnlist.txt/N02-08_EB03.csv | nkf --utf8 | sort | uniq -c | awk '{if ($1>4)print $2}' | nkf -s | awk ' {print "ogr2ogr -f kml "NR".kml N02-08_EB03.shp -overwrite -where STN=" $1};' | sh

駅名シードファイルから5件以上重複する駅名を取り出して、ogr2ogrに渡しています。-whereオプションで駅名フィールドの完全一致を取り出しました。
ogr2ogr -f kml new.kml source.shp -overwrite -where STN=SJIS駅名

3. 文字コードの変換
find . -name "*.kml" -exec nkf --utf8 --overwrite {} \;

出力したKMLがSJISなため、UTF-8に一括変換しました。




※駅データは、事前に変換ツールでShapeファイルに変換しています。


駅別KMLデータ一覧(5件以上同一駅名があったもの)


三田駅 google map

上野駅 google map

中野駅 google map

京橋駅 google map

京都駅 google map

仙台駅 google map

住吉駅 google map

元町駅 google map

八丁堀駅 google map

北千住駅 google map

名古屋駅 google map

品川駅 google map

大分駅 google map

大宮駅 google map

大手町駅 google map

大曽根駅 google map

大町駅 google map

大船駅 google map

大阪駅 google map

大阪上本町駅 google map

天王寺駅 google map

姫路駅 google map

小倉駅 google map

小田原駅 google map

尼崎駅 google map

岡山駅 google map

市役所前駅 google map

新大阪駅 google map

新宿駅 google map

新橋駅 google map

新潟駅 google map

日暮里駅 google map

日本橋駅 google map

東京駅 google map

梅田駅 google map

横浜駅 google map

橋本駅 google map

池袋駅 google map

浅草駅 google map

渋谷駅 google map

熱海駅 google map

白石駅 google map

盛岡駅 google map

県庁前駅 google map

神保町駅 google map

神田駅 google map

福島駅 google map

秋葉原駅 google map

立川駅 google map

米原駅 google map

西船橋駅 google map

追分駅 google map

郡山駅 google map

金山駅 google map

飯田橋駅 google map

高崎駅 google map

高田駅 google map

鹿児島中央駅 google map

黒川駅 google map

合わせて読む
dbfファイルの文字コード変換 3. 文字コードの変換を事前に変換するパターンです

2009年4月10日金曜日

Python から OpenStreetMapのデータを修正してみる はてなブックマークに追加

ハンディGPSデータロガー m-241を買ってから、ちょこちょことOpenStreetMapにデータを投稿していたのですが、編集ソフトを使ってやるよりAPIから操作したくなるのが人情というもの、APIのドキュメントをみていると追加や削除の情報はいろいろ乗っていたのですが、拠点の修正がよく分からなかったのでテストしたメモです。


OSMのAPIの基本


・HTTPのMETHODでデータを管理する
・1アクセス1オブジェクト
・XMLでデータを表現する

OSMの種類



目的HTTP METHODサンプル
作成 PUT http://api.openstreetmap.org/api/0.5/(node|way)/create
取得 GET http://api.openstreetmap.org/api/0.5/(node|way)/{ID}
修正 PUT http://api.openstreetmap.org/api/0.5/(node|way)/{ID}
削除 DELETE http://api.openstreetmap.org/api/0.5/(node|way)/{ID}


Python から OpenStreetMapのデータを修正した場合のサンプル


この例では花やしきのPointデータを修正します。花やしきのIDは「369934997」になるのでこちらを{ID}にしています。

-*- coding: utf-8 -*-
import httplib, base64
username="xxxx"
password="yyyy"

authheader = "Basic %s" % base64string
headers = {"Authorization": authheader}

body='''








'''
conn = httplib.HTTPConnection("api.openstreetmap.org:80")
conn.request("PUT", "/api/0.5/node/369934997", body, headers)
response = conn.getresponse()
print response.status, response.reason
data = response.read()
#print data
conn.close()


※2週間後にはAPIのバージョンが0.6に変わるようなので、すぐに役に立たなくなります



2009年3月21日土曜日

HOLUX m-241のログをMac OS Xで取得メモ はてなブックマークに追加

HOLUX m-241を買ったのだが、当然Mac OS Xはサポート外でしたorz...しかたないので先人たちの知恵がないかと調べてみると bt747というJavaアプリを利用することでログ取得ができるそうなので早速トライ。

参考にしたサイト達


[Mac OS X]単3電池1本で動くGPSロガー HOLUX m-241をMac OS Xで使う
GPSロガー用ソフトウェアがMacOSXで動いた!

以前はデータを書き換えやら設定やらが必要そうだったのですが、 bt747がバージョンアップしたせいか、実際は4stepくらいでさくっとできました。あとUSBドライバーのダウンロード先URLが変わっていたりとか、微妙な違いがあったのでメモ代わりに投稿。

  1. CP210x USB to UART Bridge VCP Drivers ここからMac OS X用USBドライバーを取得する。

  2. /var/lockというディレクトリを作成し、ログインしているアカウントで書き込み権限を与える。(sudo mkdir /var/lock ;sudo chmod 777 /var/lock;

  3. bt747をダウンロードして、解凍する。解凍先フォルダに移動してbt747_macosX_j2se.commandを起動する

  4. ウィンドウ一番下にある"conn"ボタンの横の設定を「USB(for Linux,Mac)」に、speedを「38400」に変更する。(画面真ん中のdownloadボタンが押せるようになったら完了)



2009年3月3日火曜日

flickrのGeoTagの自動付与の設定について はてなブックマークに追加

過去の記事FlickrのAPIを使ってGeoTagからflickrのMapを追加するscrpitを書いて満足していたのですが、ちょっと調べてみたら自動でMap情報を設定する方法がありました。


設定方法は、FlickrのアカウントページからPrivacy & Permissionsを選択して、Defaults for new uploadsの項目のImport EXIF location dataのYes please, that would be lovely.にチェックを入れて"Save"ボタンを押すだけで設定完了です。これで画像をアップロードするか編集したら自動的に緯度経度等のMap情報が付くようになりました。

やはり、セキュリティの問題があるためデフォルトオフになっていただけなんですね。
英語が読めないのかがバレバレで恥ずかしいのです。

2009年2月4日水曜日

Nikon p6000のGeoTagをflickrに登録するその2 はてなブックマークに追加

年末にNikon COOLPIXP6000を子供が落として壊してしまい、修理に出したところGeoTagの使用が変わったようだ。(ファームウェアのバージョンもNikonのサイトを見ても特に何も変わっていないのでflickr側の仕様変更かも)
以前作成したスクリプトがエラーで動作しなくなってしまったためそこで変わった版で修正。
しかし、落下は保険が効かなくて1万7千円も修理費がかかってしまった。1万7千といえばGPSロガーがかえる金額...

自分が把握している修正内容
■Tagが 「Latitude」から 「GPS Latitude」というようにGPS関連のタグに「GPS 」の接頭語が付いた
■緯度経度の表示が度分から度分秒になった。

ぱっと見た感じ標準っぽいフォーマットになり使いやすくなったと思います。(プログラムも正規表現で短くなりました)


import flickrapi
import re

api_key = 'XXXXXXXXXXXXXXXXXXXX'
secret_key = 'YYYYYYYYYYYYYYY'
my_id = 'ZZZZZZ@N00'


flickr = flickrapi.FlickrAPI(api_key,secret_key)

#auth
(token, frob) = flickr.get_token_part_one(perms='write')
if not token: raw_input("Press ENTER after you authorized this program")
flickr.get_token_part_two((token, frob))


search = flickr.photos_getWithoutGeoData( sort='date-posted-desc',page=2,per_page=45)

for photo in search.photos[0].photo:
print photo['id'] + " " + photo['title']
getexif = flickr.photos_getExif(photo_id = photo['id'] )
if( getexif.photo):
try:
lat = lon = ""
for exif in getexif.photo[0].exif:
if( exif['label'] == 'GPS Latitude' ):
lat = ( exif.raw[0].text )
if( exif['label'] == 'GPS Longitude' ):
lon = ( exif.raw[0].text )
if( exif['label'] == 'GPS Altitude' ):
alt = ( exif.raw[0].text )
if( exif['label'] == 'GPS Time (atomic clock)' ):
time = ( exif.raw[0].text )
if( exif['label'] == 'Direction of Image' ):
dire = ( exif.raw[0].text )


rLat = re.compile("([\d]{2,3}) deg ([\d]{2}).+ ([\d]{2}.[\d]*).*").match(lat)
rLon = re.compile("([\d]{2,3}) deg ([\d]{2}).+ ([\d]{2}.[\d]*).*").match(lon)
if( rLat.group() and rLon.group() ):
lat = int(rLat.group(1) ) + float(rLat.group(2))/60 + float(rLat.group(3))/3600
lon = int(rLon.group(1) ) + float(rLon.group(2))/60 + float(rLon.group(3))/3600
print lat
print lon

#lon = int(db[0]) +float( mb[0] ) /float(mb[1]) / 60
print "http://maps.google.co.jp/?ie=UTF8&ll="+str(lat)+","+str(lon)+"&spn=0.001073,0.002006&z=19"
#flickr.photos_geo_setLocation(photo_id = photo['id'],lat=lat,lon = lon)
#print a[0]

except AttributeError:
#print "error"
continue




GeoTagが付いている場合は、Flickr形式に変換して、FlickrにGeo情報を付与。


※2009/03/03 修正
 APIを利用しなくてもGeoTagを自動で付与するオプションがあります。

2009年1月27日火曜日

flickrと顔ラボAPIの連携(python flickrapi版) はてなブックマークに追加

富士フィルムの顔ラボAPIを使ってみたくなったのでちょっとテスト。
ぱっとみた感じは、なかなか良い精度で判定する模様です。画像の縦横比は1:1しかないみたいだけど、自分の目的としてはOK。

フロー
  1. flickrの画像URLを顔ラボAPIに渡します。
  2. 顔ラボの戻り値をflickrのnoteに設定


※flickrのflickr.photos.notes.addのAPIは500pxの画像をもとにnotoの位置指定をしますので500pxの画像(middle)を指定する必要があります
※当然flickrのappidや顔ラボAPIの認証キーは別途取得が必要です。

kaolab.py




# coding: UTF-8

import flickrapi
import urllib2
from lxml import objectify



api_key = 'xxxxxxxx'
secret_key = 'yyyyyy'
my_id = 'xxxxx@N00'
kao_id = 'aaaa'

flickr = flickrapi.FlickrAPI(api_key,secret_key)

#auth
(token, frob) = flickr.get_token_part_one(perms='write')
if not token: raw_input("Press ENTER after you authorized this program")
flickr.get_token_part_two((token, frob))

photo_id = 'bbbbb'
path = 'http://farm4.static.flickr.com/3481/bbbbb_2505c93628.jpg'
url = 'https://kaolabo.com/api/detect?apikey=' + kao_id + '&url='+path
tree = objectify.parse(urllib2.urlopen(url))
root = tree.getroot()
o=0
for face in root.faces.getchildren():
h = root.faces.face[o].get("height")
w = root.faces.face[o].get("width")
x = root.faces.face[o].get("x")
y = root.faces.face[o].get("y")
score = root.faces.face[o].get("score")
t = u'顔ラボAPI : http://kaolabo.com/webapi/'
set_note = flickr.photos_notes_add(photo_id = photo_id,note_x = x ,note_y = y, note_w = w,note_h =h,note_text = t )
o = o + 1

2009年1月17日土曜日

X02NKのSports TrackerのGPSデータをメールから取得する はてなブックマークに追加

SoftbankのNokia製携帯のX02NKSports Trackerを使うと生GPSデータが取得できます。取得したデータはBlueToothやメールで転送できるのでGPSデータでいろいろ遊ぼうと思いました。
ただ、MacだとX02NKのファイルを取り出すのが結構めんどうなので、簡単なツールを作ってみました。
そこSport TrackerのGPSログをメールで転送し、メールサーバからimapで取得してローカルに保存するスクリプトを作ってみました。

GMailにimapで接続し、携帯のメールアドレスかつ新着メールを探します。
見つかったら、bodyを取り出して保存します。
最後に該当のメールを既読に変更して終了。

getgmail.py




# vim:fileencoding=utf-8
import imaplib
"""
python getmail.py
"""
server = "imap.gmail.com"
user = "xxxxxx"
passwd = "yyyyyy"
mailadr = "@softbank.ne.jp"


M = imaplib.IMAP4_SSL(server)
M.login(user,passwd)
M.select()
typ, data = M.search(None, 'FROM', mailadr,'UNSEEN')
#typ, data = M.search(None, '(FROM mailadr)','NEW')

for num in data[0].split():
typ, data = M.fetch(num, '(RFC822)')
body = data[0][1].split("\r\n\r\n")
msg = body[1]
ofile = open("track"+str(num)+".xml", "w")
ofile.write(msg)
ofile.close()
print num
M.store(num, '+FLAGS', '\SEEN')
M.close()
M.logout()


今日の参考リンク

X02NK Sports Tracker GPSでジョギング等のデータを保存出来るアプリ!

imaplib -- IMAP4 プロトコルクライアント
Gmailのメール一覧を取得CommentsAdd Star

2009年1月12日月曜日

geotoolsをjythonで利用する はてなブックマークに追加

国土地理院が出している基盤地図情報を見てみようと思ったのですが、自分の環境では、JPGIS形式の変換ツールが使えない。。。仕方ないのでGML版をGDAL/OGLで変換しようと思ったのですが、どうもうまくいかない。。。しゃあないので他の調べてみたらgeotoolsというJAVAのGIS Tool kitを発見した。
結構おもしろそうなツールですが、Javaはダメなんでjython経由で使って見ました。


shape fileにアクセスするサンプル

こちらの世界の人口データから、国名と人口を取り出す。

shape.py



"""
Usage:
CLASSPATH="/home/nishioka/src/geotools-2.5.1/gt-epsg-hsql-2.5.1.jar" jython shape.py

"""
import java.net.URL as uri
import java.io.File
import org.geotools.data.shapefile.ShapefileDataStore as shp


src = uri("file:////home/nishioka/data/TM_WORLD_BORDERS_SIMPL-0.3.shp")
data = shp(src)

name = data.getTypeNames()
#s = data.getSchema()
s = data.getSchema(name[0])

src = data.getFeatureSource(name[0])

ft = src.getSchema()
coll = src.getFeatures()
print coll.size()

it = coll.features()

while (it.hasNext() ):
f = it.next()
print str(f.getAttribute(5))+" "+ str(f.getAttribute(7))





実行結果




CLASSPATH="/home/nishioka/src/geotools-2.5.1/gt-shapefile-2.5.1.jar" ¥
jython
shape.py
246
Antigua and Barbuda 83039
Algeria 32854159
Azerbaijan 8352021
Albania 3153731
Armenia 3017661
Angola 16095214
American Samoa 64051
Argentina 38747148
Australia 20310208
Bahrain 724788
Barbados 291933
Bermuda 64174
Bahamas 323295
Bangladesh 15328112
Belize 275546
Bosnia and Herzegovina 3915238
Bolivia 9182015
Burma 47967266
Benin 8490301


今日はここまで。
どうも、GMLは非公式サポートでうまく読み込むことができなさそう。。。
結局windowsの変換ツールを使うのがFAっぽいのですが、もう少し調査します。


今日の参考リンク
SHPファイルへGeoToolsを使用してJavaからアクセスする為の基本コード - Blue blue glass moon
Technical Ramblings > Blog Archive > Using Jython + GeoTools

http://thematicmapping.org/downloads/world_borders.php

2008年12月14日日曜日

GeoPlanetのPlaceType一覧 その2 はてなブックマークに追加

こじんてきにGeoPlanetに興味津々のため、引き続き調査メモです。
GeoPlanetのPlaceType一覧で世界全体でのコード分布がわかったので、次に日本でどのようなPlaceTypeがあるか、簡単なクローラーを作って調査してみました。
クローラーは、日本のwoeidからchirldrenを再起的に探索しています。ただし、途中で接続エラーになるため現状3000レコードくらいした探索できていません。
まだ、調査中なので網羅されていないコードがありそうです。


PlaceType 7 WOE_TOWN
市町村
例 府中市 普代村 嵐山町

8 Prefecture 県
例 北海道 滋賀県 京都府
日本語の場合は、nameがState(州)からPrefectureに変更になっている

9 Gun/Ku 郡/区
例  胆沢郡 遠田郡 乙訓郡
日本語の場合は、nameがCounty(州)から Gun/Kuに変更になっている
※現時点では区に対応するデータが見つからなかった。

10 WOE_LOCALADMIN 町丁目
例 ハウステンボス町 花高 鹿子前町


11 WOE_ZIP 郵便番号
例 857-4815 761-8058 023-1761
日本のデータでは7桁の完全な郵便番号しか存在しないようです。

12 WOE_COUNTRY 国
例 日本

13 WOE_ISLAND 島
本州 赤瀬 五島列島 沖ノ島

14 WOE_AIRPORT 空港
高松空港

15 WOE_DRAINAGE 川 湖沼
例 北上川 諏訪湖 涸沼

16 WOE_LANDFEATURE 地上物(観光地?)
例 女木海水浴場 三界山 岸和田市今池公園

20 WOE_POI POI(病院、駅、学校、役所、劇場)
例 ワーナー・マイカル・シネマズ東岸和田 佐世保駅 斉藤医院

22 WOE_SUBURB 番地
例 3丁目 (丁目なし)


24 WOE_COLLOQUIAL 地方
中部地方 八丈支庁 能登半島 中京地方

27 WOE_HISTORICALCOUNTY なくなった自治体 (?)
例 佐賀郡 Aoba-ku  龍神村
データをみると、なくなっていない自治体が多い、合併された等で形が変わっただけで変更になるのかも?その場合woeidは変更になるのだろうか?


WOE_HISTORICALCOUNTY で、どのくらい古いデータをもっているのか、合併情報のフレッシュネスあたりを調べていこうかと思います。


関連記事

GeoPlanetについて
GeoPlanetのPlaceType一覧
GeoPlanetのPlaceType一覧 その2

2008年12月10日水曜日

GeoPlanetのPlaceType一覧 はてなブックマークに追加

前回の続きです。

GeoPlanetのPlaceType一覧と意訳を作ってみました。


歴史上の場所といったデータやスポーツチームというplaceTypeが特徴的ですね。
ただ、同じIDで違う名前のものがあるようです。また、日本国内のデータ分布が調べたかったのですが、PlaceTypeだけの検索ができないので、日本の市町村合併をどのくらい網羅しているかがわからないですね。

0Undefined未定義未定義の場所
1Buildingビルディング住所表記内の街区(ハウス)ナンバーにマッチしているもの
2Street Segmentストリートセグメント住所表記内のストリートにマッチしているストリートセグメントです
3Nearby Buildingビルディング周辺住所表記内の街区(ハウス)ナンバーの近くに街区(ハウス)ナンバーを持つビルディング
4Streetストリート住所表記内のストリートにマッチしたもの
5Intersection交差点検索クエリーにマッチする道路の交差点
6Streetストリートストリート(通り)
7Town人が定住している場所、主に市、町、村
8Stateその国の中の最上位行政区分のうちの1つ(訳注 日本だと県)
9Countyその国の中の2階層目の行政区分のうちの1つ
10Local Administrative Areaローカル行政区分その国の中の3階層目の行政区分のうちの1つ
11Postal Code郵便番号一部または完全な郵便番号
12CountryISO 3166-1によって定義される国または属領のうちの1つ
13Island
14Airport空港空港
15Drainage水上物水に関連した地物(例えば川、運河、湖、湾、海)
16Land Feature地上物 土に関連した地物(例えば公園、山、浜辺)
17Miscellaneous寄せ集めの場所カテゴライズできない場所
18NationalityNaNAn area affiliated with a nationality
19SupernameSupername複数の国にまたがる地域
20Point of Interest関心点(訳注POI)関心点(例えば学校、病院、観光名所)
21Region地域複数の国の一部にまたがる地域
22Suburb 郊外郊外や団地といった町の区分
23Sports Teamスポーツチームスポーツチーム
24Colloquial口語口語で知られている場所名
25ZoneNaN特定の文脈(例えばMSA("Metropolitan Statistical Areas")またはエリアコード)の範囲内のエリア/td>
26Historical State歴史上の州その国の中の最上位階層目の行政区分で現在は利用されていないもの
27Historical County歴史上の郡その国の中の2階層目の行政区分で現在は利用されていないもの
29Continent大陸地球の主な大陸のうちの1つ
31Time Zoneタイムゾーンオルソン標準によって定義される地域(tzデータベース)
32Nearby Intersection近くの交差点 検索クエリーで通りの近くにある街路の交差点
An intersection of streets that is nearby to the streets in a query string
33Estate地所集合住宅、または名前の知られた分譲地
35Historical Town歴史上の町人が定住している場所にある、もう使われていない原名
36Aggregate集計集計された場所


関連記事

GeoPlanetについて
GeoPlanetのPlaceType一覧
GeoPlanetのPlaceType一覧 その2

2008年12月9日火曜日

GeoPlanetについて はてなブックマークに追加

Yahoo Developer Network(アメリカ版)GeoPlanet APIは日本語の住所検索(大字くらいまで)やランドマーク検索(島、目標物)ができるうえ、住所の親子関係や隣接情報といった情報も保持しています。

親子関係をしっかり持ったGeo系WebAPIが少ない現状、GeoPlanetの使い道はいろいろありそうなので、自分用のメモがてらに整理してみました(世界の地物をWoEIDというユニークのIDで管理しようとしているため、このID体系がはやった場合に、複数のWebリソースをWoEIDをキーに串刺しして利用できそうです)。



/places
fliterにマッチした情報を返します
filterで利用できるものは、キーワードとplacetypesです。
東京タワー,芝公園&WOE_LOCALADMIN(町丁目名),太平洋(詳細情報あり

/place/{woeid}
指定したwoeidの詳細情報を返します
詳細情報は、緯度経度、Boundingbox(矩形)などです。
石垣市,三重県,豊橋市,東京タワー

/place/{woeid}/parent
指定したwoeidの親データを返します。 市町村だった場合は県、県だった場合は国
石垣市,三重県,豊橋市

/place/{woeid}/ancestors
指定したwoeidの親階層を下の階層から順番に返します。belongtosとの違いは、完全な親子関係のものしか返さないようです。
大字とかがどの都道府県に入っているかがわかります。また住所表記のサポートもできそうです。
東京都台東区浅草1丁目,三重県,豊橋市,名古屋城


/place/{woeid}/belongtos
親階層を順番にたどって表示します。ancestorsとの違いは、上位であればジャンルが違っている親も郵便番号や地域圏名(関東、アジア、世界)も返します
東京都台東区浅草1丁目,三重県,豊橋市,名古屋城

/place/{woeid}/neighbors
該当するwoeidをもつ情報の近くの場所を返します
ポリゴンデータ+アルファのデータをもとのやっているようですね
※必ずしも地理的に隣接するというわけではないことに注意すべきです。
石垣市(404 not found航路は出てこない),三重県,木更津(地続きではない川崎が出てくることに注目、アクアラインで接続している)


/place/{woeid}/siblings
指定したwoeidの親が一緒の兄弟情報を返します(松戸市の場合は千葉県の市町村一覧)
松戸市,台東区(東京は特殊で23区のみしかかえってこない),日本(世界の国)

/place/{woeid}/children
該当するwoeidを親とする情報を返します(子一覧)
例 木更津,豊橋(placetypeが町丁目のみ)

/placetypes
placetypeの一覧を返します。
placetype一覧(詳細付)

/placetype
placetypeの詳細説明を返します
※コードが一緒でも選択する言語でplacetype名が変わるみたい,WOE_STATEがstateやprefecutreになった。
9(country),8(WOE_STATE)





ぱっと思いつくのは、都道府県、市町村といったカテゴリを生成することに利用できそうですね。ただ、階層構造があれれっという場所も多いですし、そもそもwoeidがまったく世の中に流通していないので利用するには独自にJISコード等とのマッチングが必要になりますね。

ほかにも,YQLというSQLライクなフィルターもあるようです。


関連記事

GeoPlanetについて
GeoPlanetのPlaceType一覧
GeoPlanetのPlaceType一覧 その2

2008年12月6日土曜日

Flickr GeoFeedとGoogle Static APIとの連携 はてなブックマークに追加

Google blogger上でFlikr GeoFeedGoogle Static Map APIとの連携をするモジュールを書いてみた。
Flikr GeoFeedはjsonpでも動くので、javascriptのみなので気軽にblog等に貼付けれると思います。
ローカル上では問題なく動くのですが、bloggerでは出たり出なかったりするときがあるの調査中です。