/** * Comparing on geohash ensures that nearby nodes will be close * to each other in the list. */ static int circ_node_compare(const void* v1, const void* v2) { POINT2D p1, p2; unsigned int u1, u2; CIRC_NODE *c1 = (CIRC_NODE*)v1; CIRC_NODE *c2 = (CIRC_NODE*)v2; p1.x = rad2deg((c1->center).lon); p1.y = rad2deg((c1->center).lat); p2.x = rad2deg((c2->center).lon); p2.y = rad2deg((c2->center).lat); u1 = geohash_point_as_int(&p1); u2 = geohash_point_as_int(&p2); if ( u1 < u2 ) return -1; if ( u1 > u2 ) return 1; return 0; }
static void test_geohash_point_as_int(void) { unsigned int gh; POINT2D p; unsigned long long rs; p.x = 50; p.y = 35; gh = geohash_point_as_int(&p); rs = 3440103613; CU_ASSERT_EQUAL(gh, rs); p.x = 140; p.y = 45; gh = geohash_point_as_int(&p); rs = 3982480893; CU_ASSERT_EQUAL(gh, rs); p.x = 140; p.y = 55; gh = geohash_point_as_int(&p); rs = 4166944232; CU_ASSERT_EQUAL(gh, rs); }