[Groonga-commit] groonga/groonga [master] [geo] use meaningful name for approximate types. refs #1226

Back to archive index

null+****@clear***** null+****@clear*****
2011年 12月 28日 (水) 11:36:15 JST


Kouhei Sutou	2011-12-28 11:36:15 +0900 (Wed, 28 Dec 2011)

  New Revision: 67701f112536c019bf243225eff76440a1b89831

  Log:
    [geo] use meaningful name for approximate types. refs #1226
    
    * distance  -> distance_rectangle.
    * distance2 -> distance_sphere.
    * distance3 -> distance_ellipsoid.

  Modified files:
    lib/geo.c
    lib/geo.h
    lib/proc.c

  Modified: lib/geo.c (+56 -25)
===================================================================
--- lib/geo.c    2011-12-28 11:11:24 +0900 (dde52ce)
+++ lib/geo.c    2011-12-28 11:36:15 +0900 (f0b1e9f)
@@ -268,7 +268,7 @@ grn_geo_table_sort_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));
-      d = grn_geo_distance_raw(ctx, base_point, &point);
+      d = grn_geo_distance_rectangle_raw(ctx, base_point, &point);
       inspect_tid(ctx, tid, &point, d);
 
       diff_bit_prev = diff_bit_current;
@@ -480,7 +480,8 @@ grn_geo_get_meshes_for_circle(grn_ctx *ctx, grn_geo_point *base_point,
         }
         meshes[n_meshes].key.latitude = lat;
         meshes[n_meshes].key.longitude = lng;
-        d = grn_geo_distance_raw(ctx, base_point, &(meshes[n_meshes].key));
+        d = grn_geo_distance_rectangle_raw(ctx, base_point,
+                                           &(meshes[n_meshes].key));
         if (d < d_far) {
 #ifdef GEO_DEBUG
           printf("sub-mesh: %d: (%d,%d): (%d,%d;%d,%d)\n",
@@ -537,7 +538,7 @@ grn_geo_table_sort_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));
-          d = grn_geo_distance_raw(ctx, base_point, &pos);
+          d = grn_geo_distance_rectangle_raw(ctx, base_point, &pos);
           inspect_tid(ctx, tid, &pos, d);
           while ((posting = grn_ii_cursor_next(ctx, ic))) {
             grn_id rid = accessorp
@@ -751,7 +752,7 @@ grn_geo_select_in_circle(grn_ctx *ctx, grn_obj *index,
     uint8_t geo_key1[sizeof(grn_geo_point)];
     uint8_t geo_key2[sizeof(grn_geo_point)];
 
-    d_far = grn_geo_distance_raw(ctx, center, &on_circle);
+    d_far = grn_geo_distance_rectangle_raw(ctx, center, &on_circle);
     grn_gton(geo_key1, center, sizeof(grn_geo_point));
     grn_gton(geo_key2, &on_circle, sizeof(grn_geo_point));
     diff_bit = compute_diff_bit(geo_key1, geo_key2);
@@ -1735,7 +1736,8 @@ exit :
 }
 
 double
-grn_geo_distance_raw(grn_ctx *ctx, grn_geo_point *point1, grn_geo_point *point2)
+grn_geo_distance_rectangle_raw(grn_ctx *ctx,
+                               grn_geo_point *point1, grn_geo_point *point2)
 {
   double lng1, lat1, lng2, lat2, x, y;
 
@@ -1749,7 +1751,8 @@ grn_geo_distance_raw(grn_ctx *ctx, grn_geo_point *point1, grn_geo_point *point2)
 }
 
 double
-grn_geo_distance2_raw(grn_ctx *ctx, grn_geo_point *point1, grn_geo_point *point2)
+grn_geo_distance_sphere_raw(grn_ctx *ctx,
+                            grn_geo_point *point1, grn_geo_point *point2)
 {
   double lng1, lat1, lng2, lat2, x, y;
 
@@ -1763,8 +1766,9 @@ grn_geo_distance2_raw(grn_ctx *ctx, grn_geo_point *point1, grn_geo_point *point2
 }
 
 double
-grn_geo_distance3_raw(grn_ctx *ctx, grn_geo_point *point1, grn_geo_point *point2,
-                      int c1, int c2, double c3)
+grn_geo_distance_ellipsoid_raw(grn_ctx *ctx,
+                               grn_geo_point *point1, grn_geo_point *point2,
+                               int c1, int c2, double c3)
 {
   double lng1, lat1, lng2, lat2, p, q, r, m, n, x, y;
 
@@ -1783,7 +1787,30 @@ grn_geo_distance3_raw(grn_ctx *ctx, grn_geo_point *point1, grn_geo_point *point2
 }
 
 double
-grn_geo_distance(grn_ctx *ctx, grn_obj *point1, grn_obj *point2)
+grn_geo_distance(grn_ctx *ctx, grn_obj *point1, grn_obj *point2,
+                 grn_geo_approximate_type type)
+{
+  double d = 0.0;
+
+  switch (type) {
+  case GRN_GEO_APPROXIMATE_RECTANGLE :
+    d = grn_geo_distance_rectangle(ctx, point1, point2);
+    break;
+  case GRN_GEO_APPROXIMATE_SPHERE :
+    d = grn_geo_distance_sphere(ctx, point1, point2);
+    break;
+  case GRN_GEO_APPROXIMATE_ELLIPSOID :
+    d = grn_geo_distance_ellipsoid(ctx, point1, point2);
+    break;
+  default :
+    ERR(GRN_INVALID_ARGUMENT, "unknown approximate type: <%d>", type);
+    break;
+  }
+  return d;
+}
+
+double
+grn_geo_distance_rectangle(grn_ctx *ctx, grn_obj *point1, grn_obj *point2)
 {
   double d = 0;
   grn_bool point1_initialized = GRN_FALSE;
@@ -1818,9 +1845,9 @@ grn_geo_distance(grn_ctx *ctx, grn_obj *point1, grn_obj *point2)
   } else {
     goto exit;
   }
-  d = grn_geo_distance_raw(ctx,
-                           GRN_GEO_POINT_VALUE_RAW(point1),
-                           GRN_GEO_POINT_VALUE_RAW(point2));
+  d = grn_geo_distance_rectangle_raw(ctx,
+                                     GRN_GEO_POINT_VALUE_RAW(point1),
+                                     GRN_GEO_POINT_VALUE_RAW(point2));
 exit :
   if (point1_initialized) {
     GRN_OBJ_FIN(ctx, &point1_);
@@ -1832,7 +1859,7 @@ exit :
 }
 
 double
-grn_geo_distance2(grn_ctx *ctx, grn_obj *point1, grn_obj *point2)
+grn_geo_distance_sphere(grn_ctx *ctx, grn_obj *point1, grn_obj *point2)
 {
   double d = 0;
   grn_bool point2_initialized = GRN_FALSE;
@@ -1845,9 +1872,9 @@ grn_geo_distance2(grn_ctx *ctx, grn_obj *point1, grn_obj *point2)
       if (grn_obj_cast(ctx, point2, &point2_, 0)) { goto exit; }
       point2 = &point2_;
     }
-    d = grn_geo_distance2_raw(ctx,
-                              GRN_GEO_POINT_VALUE_RAW(point1),
-                              GRN_GEO_POINT_VALUE_RAW(point2));
+    d = grn_geo_distance_sphere_raw(ctx,
+                                    GRN_GEO_POINT_VALUE_RAW(point1),
+                                    GRN_GEO_POINT_VALUE_RAW(point2));
   } else {
     /* todo */
   }
@@ -1859,7 +1886,7 @@ exit :
 }
 
 double
-grn_geo_distance3(grn_ctx *ctx, grn_obj *point1, grn_obj *point2)
+grn_geo_distance_ellipsoid(grn_ctx *ctx, grn_obj *point1, grn_obj *point2)
 {
   double d = 0;
   grn_bool point2_initialized = GRN_FALSE;
@@ -1873,15 +1900,19 @@ grn_geo_distance3(grn_ctx *ctx, grn_obj *point1, grn_obj *point2)
       point2 = &point2_;
     }
     if (domain == GRN_DB_TOKYO_GEO_POINT) {
-      d = grn_geo_distance3_raw(ctx,
-                                GRN_GEO_POINT_VALUE_RAW(point1),
-                                GRN_GEO_POINT_VALUE_RAW(point2),
-                                GRN_GEO_BES_C1, GRN_GEO_BES_C2, GRN_GEO_BES_C3);
+      d = grn_geo_distance_ellipsoid_raw(ctx,
+                                         GRN_GEO_POINT_VALUE_RAW(point1),
+                                         GRN_GEO_POINT_VALUE_RAW(point2),
+                                         GRN_GEO_BES_C1,
+                                         GRN_GEO_BES_C2,
+                                         GRN_GEO_BES_C3);
     } else {
-      d = grn_geo_distance3_raw(ctx,
-                                GRN_GEO_POINT_VALUE_RAW(point1),
-                                GRN_GEO_POINT_VALUE_RAW(point2),
-                                GRN_GEO_GRS_C1, GRN_GEO_GRS_C2, GRN_GEO_GRS_C3);
+      d = grn_geo_distance_ellipsoid_raw(ctx,
+                                         GRN_GEO_POINT_VALUE_RAW(point1),
+                                         GRN_GEO_POINT_VALUE_RAW(point2),
+                                         GRN_GEO_GRS_C1,
+                                         GRN_GEO_GRS_C2,
+                                         GRN_GEO_GRS_C3);
     }
   } else {
     /* todo */

  Modified: lib/geo.h (+21 -7)
===================================================================
--- lib/geo.h    2011-12-28 11:11:24 +0900 (84a1abb)
+++ lib/geo.h    2011-12-28 11:36:15 +0900 (d2d285e)
@@ -57,6 +57,12 @@ extern "C" {
 #define GRN_GEO_KEY_MAX_BITS 64
 
 typedef enum {
+  GRN_GEO_APPROXIMATE_RECTANGLE,
+  GRN_GEO_APPROXIMATE_SPHERE,
+  GRN_GEO_APPROXIMATE_ELLIPSOID
+} grn_geo_approximate_type;
+
+typedef enum {
   GRN_GEO_CURSOR_ENTRY_STATUS_NONE            = 0,
   GRN_GEO_CURSOR_ENTRY_STATUS_TOP_INCLUDED    = 1 << 0,
   GRN_GEO_CURSOR_ENTRY_STATUS_BOTTOM_INCLUDED = 1 << 1,
@@ -108,13 +114,21 @@ grn_bool grn_geo_in_rectangle(grn_ctx *ctx, grn_obj *point,
 grn_bool grn_geo_in_rectangle_raw(grn_ctx *ctx, grn_geo_point *point,
                                   grn_geo_point *top_left,
                                   grn_geo_point *bottom_right);
-double grn_geo_distance(grn_ctx *ctx, grn_obj *point1, grn_obj *point2);
-double grn_geo_distance2(grn_ctx *ctx, grn_obj *point1, grn_obj *point2);
-double grn_geo_distance3(grn_ctx *ctx, grn_obj *point1, grn_obj *point2);
-double grn_geo_distance_raw(grn_ctx *ctx, grn_geo_point *point1, grn_geo_point *point2);
-double grn_geo_distance2_raw(grn_ctx *ctx, grn_geo_point *point1, grn_geo_point *point2);
-double grn_geo_distance3_raw(grn_ctx *ctx, grn_geo_point *point1, grn_geo_point *point2,
-                             int c1, int c2, double c3);
+double grn_geo_distance(grn_ctx *ctx, grn_obj *point1, grn_obj *point2,
+                        grn_geo_approximate_type type);
+double grn_geo_distance_rectangle(grn_ctx *ctx, grn_obj *point1, grn_obj *point2);
+double grn_geo_distance_sphere(grn_ctx *ctx, grn_obj *point1, grn_obj *point2);
+double grn_geo_distance_ellipsoid(grn_ctx *ctx, grn_obj *point1, grn_obj *point2);
+double grn_geo_distance_rectangle_raw(grn_ctx *ctx,
+                                      grn_geo_point *point1,
+                                      grn_geo_point *point2);
+double grn_geo_distance_sphere_raw(grn_ctx *ctx,
+                                   grn_geo_point *point1,
+                                   grn_geo_point *point2);
+double grn_geo_distance_ellipsoid_raw(grn_ctx *ctx,
+                                      grn_geo_point *point1,
+                                      grn_geo_point *point2,
+                                      int c1, int c2, double c3);
 
 #ifdef __cplusplus
 }

  Modified: lib/proc.c (+2 -2)
===================================================================
--- lib/proc.c    2011-12-28 11:11:24 +0900 (1d9955d)
+++ lib/proc.c    2011-12-28 11:36:15 +0900 (bf12b9f)
@@ -2530,7 +2530,7 @@ func_geo_distance2(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_
   grn_obj *obj;
   double d = 0;
   if (nargs == 2) {
-    d = grn_geo_distance2(ctx, args[0], args[1]);
+    d = grn_geo_distance_sphere(ctx, args[0], args[1]);
   }
   if ((obj = GRN_PROC_ALLOC(GRN_DB_FLOAT, 0))) {
     GRN_FLOAT_SET(ctx, obj, d);
@@ -2544,7 +2544,7 @@ func_geo_distance3(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_
   grn_obj *obj;
   double d = 0;
   if (nargs == 2) {
-    d = grn_geo_distance3(ctx, args[0], args[1]);
+    d = grn_geo_distance_ellipsoid(ctx, args[0], args[1]);
   }
   if ((obj = GRN_PROC_ALLOC(GRN_DB_FLOAT, 0))) {
     GRN_FLOAT_SET(ctx, obj, d);




Groonga-commit メーリングリストの案内
Back to archive index