Codin’ In The Free World

2011-12-29

[][] C/Objective-C GeoHash Library

GeoHashの勉強がてら、Cでライブラリを書いて、

さらにそのObjective-C wrapperも用意してみた。

C版

https://github.com/lyokato/libgeohash

Objective-C Wrapper

https://github.com/lyokato/objc-geohash


GeoHashについてはこのあたりを参照のこと。

http://blog.masuidrive.jp/index.php/2010/01/13/geohash/

使い方

緯度と軽度と求めたいハッシュの長さを指定すると

ハッシュ値を取得できる。

C版

#include <geohash.h>

char* hash = GEOHASH_encode(35.6894875, 139.6917064, 13);
...
free(hash);

Objective-C版

#import "GeoHash.h"

NSString *hash = [GeoHash hashForLatitude:35.6894875                                               
                               longitude:139.6917064                                              
                                   length:13];                                                     

/* hash equals to @"xn774c06kdtve" */

GEOHASHの値から、それが表す緯度経度の範囲を取得する

C版

GEOHASH *area;
area = GEOHASH_decode("c216ne");

/*
次のように、指定されたハッシュが表す範囲の、緯度経度の最大値、最小値をdoubleで取得できる

area->latitude.max;
area->latitude.min;
area->longitude.max;
area->longitude.min;
*/

GEOHASH_free_area(area);

Objective-C版

GHArea *area = [GeoHash areaForHash:@"c216ne"]; 

/* 
次のように、指定されたハッシュが表す範囲の、緯度経度の最大値、最小値をNSNumberのオブジェクトとして取得できる

area.latitude.max          
area.latitude.min                                                                                  
area.longitude.max
area.longitude.min 
*/

あるハッシュがあらわすブロックに隣接するブロックのハッシュ値を取得する。

隣接する方角を指定する。


C版

char *adjacent;

/*
次の四つから、隣接する方角を指定する
- GEOHASH_NORTH
- GEOHASH_WEST
- GEOHASH_EAST
- GEOHASH_SOUTH
*/

adjacent = GEOHASH_get_adjacent("dqcjq", GEOHASH_NORTH);
free(adjacent);

Objective-C版

/*
次の四つから、隣接する方角を指定する
- GHDirectionNorth
- GHDirectionWest
- GHDirectionEast
- GHDirectionSouth
*/

NSString *adjacentHash = [GeoHash adjacentForHash:@"dqcjq"                                         
                                        direction:GHDirectionNorth]; 

周囲8ブロックのハッシュ値をまとめて取得

C版

GEOHASH *neighbors;
neighbors = GEOHASH_get_neighbors("dqcw5");

/*

次のようにそれぞれの方角のブロックのハッシュ値が取れる。

neighbors->north;
neighbors->south;
neighbors->east;
neighbors->west;
neighbors->north_east;
neighbors->north_west;
neighbors->south_east;
neighbors->south_west;
*/

GEOHASH_free_neighbors(neighbors);

Objective-C版

NSNeighbors *neighbors = [GeoHash neighborsForHash:@"dqcw5"];                                      

/*

次のようにそれぞれの方角のブロックのハッシュ値が取れる。

neighbors.north                
neighbors.south                 
neighbors.east                  
neighbors.west             
neighbors.northEast        
neighbors.northWest        
neighbors.southEast        
neighbors.southWest   
*/

上記の各関数は、不正なハッシュ値をうけると、CならNULL, Objective-Cならnilを返すようになってる。

ハッシュ値の検証は次のように出来る


C版

#include <stdbool.h>
bool result = GEOHASH_verify_hash("abcde");

Objective-C版

BOOL result = [GeoHash verifyHash:@"abcde"];

とりあえずこんな感じ

2008-06-14

[][] Objective-C用のAtompubのライブラリも書いてみました

まだ完成では無いですが、だいぶ揃ってきたのでCodeReposに上げておきました。

http://coderepos.org/share/browser/lang/objective-c/Atompub


SenTestingKitでの非同期のテストの仕方がどうも分からないので

クライアントのほうががまだ全然です。

実際にアプリ作りながらデバッグしていこうかなと思ってます。


Feedのパース


NSString *feedXMLString = @"<feed xmlns=\"\">...</feed>";
AtomFeed *feed = [ AtomFeed feedWithXMLString: feedXMLString ];
NSString *title = [ feed title ];
NSCalendarDate *updated = [ feed updated ];

Entryのビルド


AtomEntry *entry = [ AtomEntry entry ];
[ entry setTitle:@"mytitle" ];
[ entry setUpdated:[ NSCalenarDate calendarDate ]];

AtomPerson *person = [ AtomPerson person ];
[ person setName:@"Lyo Kato" ];
[ person setEmail:@"example@example.org" ];
[ preson setUri:[ NSURL URLWithString:@"http://example.org/" ] ];

[ entry setAuthor: person ];

NSString *entryXMLString = [ entry stringValue ];


こんな感じで。

Atom Syndication Formatを構成するそれぞれのエレメントの

オブジェクトや、それらのアクセサを利用して、ビルドやパースが出来ます。

  • AtomService
  • AtomWorkspace
  • AtomCollection
  • AtomCategories
  • AtomCategory
  • AtomFeed
  • AtomEntry
  • AtomPerson
  • AtomGenerator
  • AtomLink
  • AtomContent
  • AtomControl

これらのクラスにはそれぞれが持つ属性や子エレメントへの

アクセサを持たせてありますが、

これらの親であるAtomElementに実装された、

もう少し低いレイヤーのアクセサも活用できます。


これらは元となるXMLを保持しているので、

例えば dc や openSearch などの拡張ネームスペース下の

要素も取得、設定することが出来ます。


クライアント部分やさらに詳細なドキュメントはまた今度

詳解 Objective-C 2.0
詳解 Objective-C 2.0
posted with amazlet at 08.06.14
荻原 剛志
ソフトバンククリエイティブ
売り上げランキング: 169