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"];

とりあえずこんな感じ

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/lyokato/20111229/1325089408
リンク元