null+****@clear*****
null+****@clear*****
2010年 8月 5日 (木) 12:03:59 JST
Kouhei Sutou 2010-08-05 03:03:59 +0000 (Thu, 05 Aug 2010)
New Revision: d6ac4d00c15b807742c35969b2d0f01e685b8134
Log:
use grn_geo_distance_raw() for computing distance.
Modified files:
lib/db.c
Modified: lib/db.c (+8 -21)
===================================================================
--- lib/db.c 2010-08-05 02:54:02 +0000 (c0b6eb0)
+++ lib/db.c 2010-08-05 03:03:59 +0000 (6222633)
@@ -23,6 +23,7 @@
#include "token.h"
#include "proc.h"
#include "module.h"
+#include "geo.h"
#include "util.h"
#include <string.h>
#include <float.h>
@@ -6583,13 +6584,11 @@ grn_table_sort_geo_detect_far_point(grn_ctx *ctx, grn_obj *table, grn_obj *index
int i = 0, diff_bit_prev, diff_bit_current;
grn_id tid;
geo_entry *ep, *p;
- double lng1, lat1, lng2, lat2, x, y, d;
+ double d;
uint8_t geo_key_prev[sizeof(grn_geo_point)];
uint8_t geo_key_curr[sizeof(grn_geo_point)];
grn_geo_point point;
- lng1 = GEO_INT2RAD(base_point->longitude);
- lat1 = GEO_INT2RAD(base_point->latitude);
*d_far = 0.0;
grn_gton(geo_key_curr, base_point, sizeof(grn_geo_point));
*diff_bit = sizeof(grn_geo_point) * 8;
@@ -6603,11 +6602,7 @@ grn_table_sort_geo_detect_far_point(grn_ctx *ctx, grn_obj *table, grn_obj *index
grn_gton(geo_key_prev, &point, sizeof(grn_geo_point));
grn_pat_get_key(ctx, pat, tid, &point, sizeof(grn_geo_point));
grn_gton(geo_key_curr, &point, sizeof(grn_geo_point));
- lng2 = GEO_INT2RAD(point.longitude);
- lat2 = GEO_INT2RAD(point.latitude);
- x = (lng2 - lng1) * cos((lat1 + lat2) * 0.5);
- y = (lat2 - lat1);
- d = ((x * x) + (y * y));
+ d = grn_geo_distance_raw(ctx, base_point, &point);
diff_bit_prev = diff_bit_current;
diff_bit_current = compute_diff_bit(geo_key_curr, geo_key_prev);
@@ -6710,12 +6705,10 @@ grn_table_sort_geo_collect_points(grn_ctx *ctx, grn_obj *table, grn_obj *index,
grn_geo_point geo_base;
mesh_entry meshes[19];
int lat_diff, lng_diff;
- double lng1, lat1, lng2, lat2, x, y, d;
+ double d;
geo_entry *ep, *p;
mesh_position position;
- lat1 = GEO_INT2RAD(base_point->latitude);
- lng1 = GEO_INT2RAD(base_point->longitude);
lat_diff = geo_max->latitude - geo_min->latitude + 1;
lng_diff = geo_max->longitude - geo_min->longitude + 1;
if (base_point->latitude >= geo_min->latitude + lat_diff / 2) {
@@ -6790,11 +6783,9 @@ grn_table_sort_geo_collect_points(grn_ctx *ctx, grn_obj *table, grn_obj *index,
}
#define add_sub_mesh(lat_diff_cmp,lng_diff_cmp,lat_diff_base,lng_diff_base)\
- lat2 = GEO_INT2RAD(geo_base.latitude + (lat_diff_cmp));\
- lng2 = GEO_INT2RAD(geo_base.longitude + (lng_diff_cmp));\
- x = (lng2 - lng1) * cos((lat1 + lat2) * 0.5);\
- y = (lat2 - lat1);\
- d = ((x * x) + (y * y));\
+ meshes[n_meshes].key.latitude = geo_base.latitude + (lat_diff_cmp);\
+ meshes[n_meshes].key.longitude = geo_base.longitude + (lng_diff_cmp);\
+ d = grn_geo_distance_raw(ctx, base_point, &(meshes[n_meshes].key));\
if (d < d_far) {\
add_mesh(lat_diff_base, lng_diff_base, diff_bit + 2);\
}
@@ -6873,11 +6864,7 @@ grn_table_sort_geo_collect_points(grn_ctx *ctx, grn_obj *table, grn_obj *index,
grn_geo_point pos;
grn_ii_posting *posting;
grn_pat_get_key(ctx, pat, tid, &pos, sizeof(grn_geo_point));
- lng2 = GEO_INT2RAD(pos.longitude);
- lat2 = GEO_INT2RAD(pos.latitude);
- x = (lng2 - lng1) * cos((lat1 + lat2) * 0.5);
- y = (lat2 - lat1);
- d = ((x * x) + (y * y));
+ d = grn_geo_distance_raw(ctx, base_point, &pos);
inspect_tid(ctx, tid, &pos, x, y, d);
while ((posting = grn_ii_cursor_next(ctx, ic))) {
grn_id rid = accessorp