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