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に変わるようなので、すぐに役に立たなくなります