独自の座標系を用いて世界中(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;
地図に表示される六角形って妙にわくわくしますね。
これでこの土日に何か作ってみる予定です。