あんまりたいしたことじゃないんだけど、
ハマったのでメモ。
以前OpenLayersでGmapを使うときに
座標を変換しなければならないというようなことを書いたんだけど
その変換をgeoDjangoでやるときにハマったので
EPSG:4326からEPSG:900913へ変換する例を示す。
>>>from django.contrib.gis.geos import Point
#EPSG:4326系の座標を設定
>>>lon = 14510632.892999999
>>>lat = 4091884.7946700002
>>>p = Point(lon,lat)
#ここが問題
#変換先の座標系(EPSG:900913)を設定
>>>p.set_srid(900913)
#変換元の座標系(EPSG:4326)から変換
>>>p.transform(4326)
>>>p.x
130.35123310029377
>>>p.y
34.468498799969531
先に変換する座標系を設定して
変換元の座標系を指定しなければならないようで
この部分を逆にしていたためハマってしまった。
自分の感覚では先に変換元を指定、あとから変換先を指定だったので
2010年11月30日火曜日
2010年11月23日火曜日
Djangoの検索
Djnagoで検索を実装していて、ちょっと困ったことがあったので、
DjangoにはデフォルトでUserクラスってデータベースのモデルが入ってる。
そのモデルの中に「性」、「名」と二つがあるんだけど、
検索をする際に、普通は「田中一」なんて入れ方をするから
文字列をどこで性と名に分ける場所が不明になる。
それで困った。
もともと性と名が一緒なら「田中」で検索して「田中一」は出るんだけどなぁ。
んで、
いろいろ探していたらQオブジェクトなるものがDjangoの中にあるらしい。
Qオブジェクトを使うことで、OR検索なんかのより複雑な検索ができるようになるとのことで、
from django.db.models import Q
from django.contrib.auth.models import User
import re
def search(req):
search_temrs = req.GET.get('search','')
if search_terms:
#空白文字があったら区切る。
p = re.compile(u"[ ]")
datas = p.split(search_terms)
for data in datas:
#一文字ずつに区切る
data = data.encode("utf_8")
char_data = list(unicode(data,"utf_8"))
for char in char_data:
char_utf = char.encode("utf_8")
#一文字ずつ性または名でOR検索をかける。
users = users.filter(Q(last_name__icontains=char_utf) | Q(first_name__icontains=char_utf))
一文字ずつ性または名でOR検索をかけるというやり方にしてみた。
もう少しスマートに書きたいところだけれどとりあえずはこれで
DjangoにはデフォルトでUserクラスってデータベースのモデルが入ってる。
そのモデルの中に「性」、「名」と二つがあるんだけど、
検索をする際に、普通は「田中一」なんて入れ方をするから
文字列をどこで性と名に分ける場所が不明になる。
それで困った。
もともと性と名が一緒なら「田中」で検索して「田中一」は出るんだけどなぁ。
んで、
いろいろ探していたらQオブジェクトなるものがDjangoの中にあるらしい。
Qオブジェクトを使うことで、OR検索なんかのより複雑な検索ができるようになるとのことで、
from django.db.models import Q
from django.contrib.auth.models import User
import re
def search(req):
search_temrs = req.GET.get('search','')
if search_terms:
#空白文字があったら区切る。
p = re.compile(u"[ ]")
datas = p.split(search_terms)
for data in datas:
#一文字ずつに区切る
data = data.encode("utf_8")
char_data = list(unicode(data,"utf_8"))
for char in char_data:
char_utf = char.encode("utf_8")
#一文字ずつ性または名でOR検索をかける。
users = users.filter(Q(last_name__icontains=char_utf) | Q(first_name__icontains=char_utf))
一文字ずつ性または名でOR検索をかけるというやり方にしてみた。
もう少しスマートに書きたいところだけれどとりあえずはこれで
2010年10月23日土曜日
OpenLayers
Gmapを勉強して
結構APIを使えるようになったら
OpenLayersで使うことになった
一番やりたいことは、OpenLayersでGmapのLocalSearchを使うこと
空間検索や住所検索、ジャンル検索なんかを
LocalSearchでできるようになったものの
OpenLayersとGmapで座標系が違うので
これが結構大変だった…
LocalSearchに渡す座標系はGmap系の座標でないといけないので
//OpenLayersの中心座標をもらってくる。GMapobjはOpenLayersでのmapオブジェクトしている。
lat = GMapobj.getCenter().lat;
lon = Gmapobj.getCenter().lon;
//座標をOpenLayersのものからGmapのものへ変換
var trans_pnt = OpenLayers.Geometry.Point(lon, lat).transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"))
var search_pnt = new google.maps.LatLng(parseFloat(trans_pnt.y),parseFloat(trans_pnt.x));
//LocalSearchで検索した結果の座標系をOpenLayersのものへ変換し、中心の位置を変更。
GMapobj.setCenter(new OpenLayers.LonLat(parseFloat(lon), parseFloat(lat)).transform( new OpenLayers.Projection("EPSG:4326"), GMapobj.getProjectionObject()));
というようなことをしないといけなかった。
結構APIを使えるようになったら
OpenLayersで使うことになった
一番やりたいことは、OpenLayersでGmapのLocalSearchを使うこと
空間検索や住所検索、ジャンル検索なんかを
LocalSearchでできるようになったものの
OpenLayersとGmapで座標系が違うので
これが結構大変だった…
LocalSearchに渡す座標系はGmap系の座標でないといけないので
//OpenLayersの中心座標をもらってくる。GMapobjはOpenLayersでのmapオブジェクトしている。
lat = GMapobj.getCenter().lat;
lon = Gmapobj.getCenter().lon;
//座標をOpenLayersのものからGmapのものへ変換
var trans_pnt = OpenLayers.Geometry.Point(lon, lat).transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"))
var search_pnt = new google.maps.LatLng(parseFloat(trans_pnt.y),parseFloat(trans_pnt.x));
//LocalSearchで検索した結果の座標系をOpenLayersのものへ変換し、中心の位置を変更。
GMapobj.setCenter(new OpenLayers.LonLat(parseFloat(lon), parseFloat(lat)).transform( new OpenLayers.Projection("EPSG:4326"), GMapobj.getProjectionObject()));
というようなことをしないといけなかった。
2010年8月30日月曜日
Google Data API
Google Mapsに空間検索機能があるということで調べていたが
それらしいAPIが見つからなかった
諦めかけていたら
Google Maps APIに空間検索機能があるのではなく
Google Data APIの中のGoogle Maps Data APIにあると分かった
すごく紛らわしい
しかし、便利ではありそう
Google Data APIでは
OAuth認証などを使わなければならないので
大変かも
また実装したりしたら載せようかな
それらしいAPIが見つからなかった
諦めかけていたら
Google Maps APIに空間検索機能があるのではなく
Google Data APIの中のGoogle Maps Data APIにあると分かった
すごく紛らわしい
しかし、便利ではありそう
Google Data APIでは
OAuth認証などを使わなければならないので
大変かも
また実装したりしたら載せようかな
2010年8月24日火曜日
2010年8月6日金曜日
ブラウザアプリでOauth認証
twitterのOauth認証できるようになったので
ブラウザアプリケーションでもやってみるかと思ったら
認証の仕方が微妙に違う(汗)
仕方ないのでこっちは別にやりました
callbackして同じページに戻ってきて、
認証するようにしています
access_tokenは保存しておきたいので、cPickleを使って保存しておく。
以下access_tokenを取得して認証する関数
#!/usr/bin/python
#!-*- coding: utf-8 -*-
import os, cPickle, cgi
from oauthtwitter import *
CONSUMER_KEY = "your consumer_key"
CONSUMER_SECRET = "your consumer_secret"
KEYFILE = "./keyfile/key.dat"
ACCESS_TOKEN = "./access_file/access_token.dat"
def twitter():
form = cgi.FieldStorage()
#access_tokenをすでに取得している場合
if os.path.isfile(ACCESS_TOKEN):
f = file(ACCESS_TOKEN,"rb")
access_token = cPickle.load(f)
f.close()
return OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token)
#access_tokenを取得していない場合
else:
#ユーザに許可をもらう前。request_tokenからurlを作成し、ユーザに許可をもらう画面にアクセスする。
if "oauth_token" not in form:
tw = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET)
request_token = tw.getRequestToken()
f = file(KEY_FILE,"wb")
cPickle.dump(request_token,f)
f.close()
authorization_url = tw.getAuthorizationURL(request_token)
print 'アクセス'%authorization_url
return None
#ユーザに許可をもらった後。access_tokenを作成し保存する。
else:
f = file(KEY_FILE,"rb")
request_token = cPickle.load(f)
f.close()
tw = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET,request_token)
access_token = tw.getAccessToken()
f = file(ACCESS_TOKEN,"wb")
cPickle.dump(access_token,f)
f.close()
return OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token)
def print_coment(api)
statuses = api.GetFriendsTimeline(count=10)
for status in statuses:
print "%s:%s"%(status.user.name,status.created_at)
print "%s"%status.text
if __name__=="__main__":
print "Content-Type: text/html"
print
api = twitter()
if(api != None):
print_coment(api)
ブラウザアプリケーションでもやってみるかと思ったら
認証の仕方が微妙に違う(汗)
仕方ないのでこっちは別にやりました
callbackして同じページに戻ってきて、
認証するようにしています
access_tokenは保存しておきたいので、cPickleを使って保存しておく。
以下access_tokenを取得して認証する関数
#!/usr/bin/python
#!-*- coding: utf-8 -*-
import os, cPickle, cgi
from oauthtwitter import *
CONSUMER_KEY = "your consumer_key"
CONSUMER_SECRET = "your consumer_secret"
KEYFILE = "./keyfile/key.dat"
ACCESS_TOKEN = "./access_file/access_token.dat"
def twitter():
form = cgi.FieldStorage()
#access_tokenをすでに取得している場合
if os.path.isfile(ACCESS_TOKEN):
f = file(ACCESS_TOKEN,"rb")
access_token = cPickle.load(f)
f.close()
return OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token)
#access_tokenを取得していない場合
else:
#ユーザに許可をもらう前。request_tokenからurlを作成し、ユーザに許可をもらう画面にアクセスする。
if "oauth_token" not in form:
tw = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET)
request_token = tw.getRequestToken()
f = file(KEY_FILE,"wb")
cPickle.dump(request_token,f)
f.close()
authorization_url = tw.getAuthorizationURL(request_token)
print 'アクセス'%authorization_url
return None
#ユーザに許可をもらった後。access_tokenを作成し保存する。
else:
f = file(KEY_FILE,"rb")
request_token = cPickle.load(f)
f.close()
tw = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET,request_token)
access_token = tw.getAccessToken()
f = file(ACCESS_TOKEN,"wb")
cPickle.dump(access_token,f)
f.close()
return OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token)
def print_coment(api)
statuses = api.GetFriendsTimeline(count=10)
for status in statuses:
print "%s:%s"%(status.user.name,status.created_at)
print "%s"%status.text
if __name__=="__main__":
print "Content-Type: text/html"
api = twitter()
if(api != None):
print_coment(api)
2010年8月2日月曜日
twitterAPIコマンドライン投稿
実際にコマンドライン投稿できるようなものを
pythonで書いてみた。
細かいところがいろいろ必要だった。
まず、python-twitterから
/usr/lib/python2.5/site-packages/のなかの
twitter.pyの中で関数PostUpdate中の
if len(status) > CHARACTER_LIMIT:
↓
if len(status.decode("utf-8")) > CHARACTER_LIMIT:
変更した。日本語の場合、statusの文字数が三倍くらいになるので、140文字投稿できないため
前回インストールしたものに加え、以下のものインストール。
oauth-python-twitterとoauthが必要になる。
インストールするにあたって
参照サイトを参考にしており、
def getAccessTokenWithPin(self, pin, url=ACCESS_TOKEN_URL):
token = self._FetchUrl(url, parameters={"oauth_verifier": pin}, no_cache=True)
return oauth.OAuthToken.from_string(token)
をoauth-python-twitterのtwitter.pyに追記してインストールしている。
さらに、twitterにアプリケーション登録を行い、
Consumer_keyとConsumer_secretをもらっておく必要がある。
#!/usr/bin/python
#!-*- coding: utf-8 -*-
import sys, os, pickle
from optparse import OptionParser
from oauthtwitter import *
CONSUMER_KEY = "CONSUMER_KEY" #実際のCONSUMER KEYを入力
CONSUMER_SECRET = "CONSUMER_SECRET" #実際のCONSUMER SECRETを入力
KEY_FILE = "KEY_FILES/twitter_key.dat"
#access_tokenを取得する。ない場合は取得し、前回のものが保存してある場合はそれを使う。
def Get_Access_Token():
if os.path.isfile(KEY_FILE):
access_token = pickle.load(file(KEY_FILE))
else:
tw = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET)
request_token = tw.getRequestToken()
authorization_url = tw.getAuthorizationURL(request_token)
print authorization_url
tw = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, request_token)
oauth_verifier = raw_input("PINを入力:\n")
access_token = tw.getAccessTokenWithPin(oauth_verifier)
pickle.dump(access_token, file(KEY_FILE,"w"))
return OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token)
#フォローしている人物のコメントを表示する。
def print_coment(option, opt_str, value, parser, *args, **kwargs):
api = Get_Access_Token()
statuses = api.GetFriendsTimeline(count=10)
for s in statuses:
print s.user.name + ":"
print s.text
#フォローしている人物の名前を表示する。
def print_friends(option, opt_str, value, parser):
api = Get_Access_Token()
users = api.GetFriends()
for user in users:
print user.name
def main():
tw = twitter()
parser = OptionParser()
parser.add_option("-t","--tweet",dest="coment",type="string",action="store",help="write coment")
parser.add_option("-w","--watch",dest="tweet",action="callback",callback=print_coment,help="watch your friend's coment")
parser.add_option("-f","--friend",dest="friend",action="callback",callback=print_friends,help="watch your friends")
(options, args) = parser.parse_args()
#コメントを投稿する。
if(options.coment != None):
post = options.coment
status = tw.PostUpdate(post)
if __name__=="__main__" :
main()
コマンドラインtwitterできるようになった!
このプログラムでツイートとフォローしている人物のコメント閲覧とフォローしている人物の名前の表示ができる。
前回の認証にはBASICを使用していたが、
今回はOAuthを使用してプログラムを書いてみた。
pythonで書いてみた。
細かいところがいろいろ必要だった。
まず、python-twitterから
/usr/lib/python2.5/site-packages/のなかの
twitter.pyの中で関数PostUpdate中の
if len(status) > CHARACTER_LIMIT:
↓
if len(status.decode("utf-8")) > CHARACTER_LIMIT:
変更した。日本語の場合、statusの文字数が三倍くらいになるので、140文字投稿できないため
前回インストールしたものに加え、以下のものインストール。
oauth-python-twitterとoauthが必要になる。
インストールするにあたって
参照サイトを参考にしており、
def getAccessTokenWithPin(self, pin, url=ACCESS_TOKEN_URL):
token = self._FetchUrl(url, parameters={"oauth_verifier": pin}, no_cache=True)
return oauth.OAuthToken.from_string(token)
をoauth-python-twitterのtwitter.pyに追記してインストールしている。
さらに、twitterにアプリケーション登録を行い、
Consumer_keyとConsumer_secretをもらっておく必要がある。
#!/usr/bin/python
#!-*- coding: utf-8 -*-
import sys, os, pickle
from optparse import OptionParser
from oauthtwitter import *
CONSUMER_KEY = "CONSUMER_KEY" #実際のCONSUMER KEYを入力
CONSUMER_SECRET = "CONSUMER_SECRET" #実際のCONSUMER SECRETを入力
KEY_FILE = "KEY_FILES/twitter_key.dat"
#access_tokenを取得する。ない場合は取得し、前回のものが保存してある場合はそれを使う。
def Get_Access_Token():
if os.path.isfile(KEY_FILE):
access_token = pickle.load(file(KEY_FILE))
else:
tw = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET)
request_token = tw.getRequestToken()
authorization_url = tw.getAuthorizationURL(request_token)
print authorization_url
tw = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, request_token)
oauth_verifier = raw_input("PINを入力:\n")
access_token = tw.getAccessTokenWithPin(oauth_verifier)
pickle.dump(access_token, file(KEY_FILE,"w"))
return OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token)
#フォローしている人物のコメントを表示する。
def print_coment(option, opt_str, value, parser, *args, **kwargs):
api = Get_Access_Token()
statuses = api.GetFriendsTimeline(count=10)
for s in statuses:
print s.user.name + ":"
print s.text
#フォローしている人物の名前を表示する。
def print_friends(option, opt_str, value, parser):
api = Get_Access_Token()
users = api.GetFriends()
for user in users:
print user.name
def main():
tw = twitter()
parser = OptionParser()
parser.add_option("-t","--tweet",dest="coment",type="string",action="store",help="write coment")
parser.add_option("-w","--watch",dest="tweet",action="callback",callback=print_coment,help="watch your friend's coment")
parser.add_option("-f","--friend",dest="friend",action="callback",callback=print_friends,help="watch your friends")
(options, args) = parser.parse_args()
#コメントを投稿する。
if(options.coment != None):
post = options.coment
status = tw.PostUpdate(post)
if __name__=="__main__" :
main()
コマンドラインtwitterできるようになった!
このプログラムでツイートとフォローしている人物のコメント閲覧とフォローしている人物の名前の表示ができる。
前回の認証にはBASICを使用していたが、
今回はOAuthを使用してプログラムを書いてみた。
2010年7月30日金曜日
twitterAPI
Twitterについて勉強中。
この業界にいて今まで触ったことなかったのでまずいよね。
とりあえずプログラムの中から使えるようにしてみる。
僕はpython使いなので
python-twitterを使うのがよさそう。
python-twitterを使うのに必要なものとして、simplejsonもインストールしておく。
OSはubuntu8.04を使っているので、
$sudo apt-get install python2.5-simplejson
でできた。
python-twitterのインストールは解凍して
$sudo python setup.py
で完了。
プログラムから使ってみる。
#!/usr/bin/python
#!-*- coding: utf-8 -*-
import twitter
api = twitter.Api("ユーザ名","パスワード")
status = api.PostUpdate("コメント")
で「コメント」を投稿できる。
なかなか面白い。
コマンドラインで実行できるようにすれば、
プログラム書いてる途中でツイートできるじゃないの!
ハマりそ!
この業界にいて今まで触ったことなかったのでまずいよね。
とりあえずプログラムの中から使えるようにしてみる。
僕はpython使いなので
python-twitterを使うのがよさそう。
python-twitterを使うのに必要なものとして、simplejsonもインストールしておく。
OSはubuntu8.04を使っているので、
$sudo apt-get install python2.5-simplejson
でできた。
python-twitterのインストールは解凍して
$sudo python setup.py
で完了。
プログラムから使ってみる。
#!/usr/bin/python
#!-*- coding: utf-8 -*-
import twitter
api = twitter.Api("ユーザ名","パスワード")
status = api.PostUpdate("コメント")
で「コメント」を投稿できる。
なかなか面白い。
コマンドラインで実行できるようにすれば、
プログラム書いてる途中でツイートできるじゃないの!
ハマりそ!
2010年3月18日木曜日
2010年2月15日月曜日
2010年2月2日火曜日
登録:
投稿 (Atom)