その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

Objective-C版GeoHexを試してみました

GeoHexとは

独自の座標系を用いて世界中(GoogleMapsのカバー範囲)を隙間の無いHex(正六角形)で埋め尽くし、Hexによって世界中の全ての緯度経度の地点を表現するための仕様。Hexの大きさは25段階(レベル)で指定できる。

・見た目がcool!!

・隣接する6つのHex間の距離が全て均等。(正方形の場合、縦横と斜めで距離が違う。)

・隣接するHexのコードの算出が容易

といった特徴を持つ。

@sa2da さんが2009年11月に仕様を発表。

クリエイティブ・コモンズのライセンス形式に則り、指定のクレジットをサイト内に掲載することで自由に「改変」「再配布」「商用利用」が可能となっている。


こちらの記事を見つけて、GeoHexのObjective-C版を試してみました。


Githubに上がってるものをダウンロードしてビルドしようとすると、

error: GeoHex.h: No such file or directory
error: Zone.h: No such file or directory


というわけで、重要なコア部分のファイルがまるっと足りず、ビルドできませんでした・・・



で、別のGeoHex Objective-C版を発見したので、こちらも試してみました。

https://github.com/gillygize/GeoHex-ObjectiveC


こちら、Xcode4でプロジェクトを開くとターゲットがGeoHex-ObjectiveC-Textになっていて、ビルドしてもそれっぽいアプリにならないので焦るのですが、ターゲットをGeoHex-ObjectiveCに変更してビルドすると、こんな感じで地図上にHex(六角形)が描画されました。



ソースをみると、こんな感じでMKPolygonとうまく連携して地図上へHexを描画しているようです。

GeoHexV3 *geoHex3 = [[GeoHexV3 alloc] initFromCode:@"RU00667382"];
CLLocationCoordinate2D coordinates3[6];
NSArray *locations3 = [geoHex3 locations];
i = 0;

for (CLLocation *location3 in locations3) {
	coordinates3[i] = location3.coordinate;
	
	i++;
	
	if (i >= 6) {
		break;
	}
}

MKPolygon *polygon3 = [MKPolygon polygonWithCoordinates:coordinates3 count:6];
[mapView addOverlay:polygon3];

[geoHex3 release];


上記サンプルから、

  • HexコードからHexオブジェクトを生成する
  • HexオブジェクトからHexの6つの角の緯度経度を取得する

といった方法がわかります。


GeoHexV3.hを見て、他に何ができるか調べてみました。


・Hexの緯度経度や地図上でのX/Y座標を取得する

@property(readonly) CLLocationCoordinate2D coordinate;	/*!< The coordinate of the GeoHex. */
@property(readonly) MKMapPoint position;				/*!< The X, Y position of the GeoHex, using the GeoHex specific coordinate system */


・Hexのサイズを取得する

+(double)hexSizeForLevel: (int) aLevel;
-(double) hexSize;


・緯度経度からHexオブジェクトを生成する

-(id)initFromLocation:(CLLocationCoordinate2D) aLocation withLevel:(int)aLevel;


地図に表示される六角形って妙にわくわくしますね。
これでこの土日に何か作ってみる予定です。