File: grn_geo.h

package info (click to toggle)
groonga 15.0.4%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 163,080 kB
  • sloc: ansic: 770,564; cpp: 48,925; ruby: 40,447; javascript: 10,250; yacc: 7,045; sh: 5,602; python: 2,821; makefile: 1,672
file content (210 lines) | stat: -rw-r--r-- 7,044 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
/*
  Copyright(C) 2009-2016 Brazil

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*/

#pragma once

#include "grn.h"
#include "grn_ii.h"
#include "grn_db.h"

#ifdef __cplusplus
extern "C" {
#endif

#define GRN_GEO_RADIUS        6357303
#define GRN_GEO_BES_C1        6334834
#define GRN_GEO_BES_C2        6377397
#define GRN_GEO_BES_C3        0.006674
#define GRN_GEO_GRS_C1        6335439
#define GRN_GEO_GRS_C2        6378137
#define GRN_GEO_GRS_C3        0.006694

#define GRN_GEO_MAX_LATITUDE  324000000       /*  90 * 60 * 60 * 1000 */
#define GRN_GEO_MAX_LONGITUDE (648000000 - 1) /* 180 * 60 * 60 * 1000 - 1 */
#define GRN_GEO_MIN_LATITUDE  -GRN_GEO_MAX_LATITUDE
#define GRN_GEO_MIN_LONGITUDE -GRN_GEO_MAX_LONGITUDE

#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,
  GRN_GEO_CURSOR_ENTRY_STATUS_LEFT_INCLUDED = 1 << 2,
  GRN_GEO_CURSOR_ENTRY_STATUS_RIGHT_INCLUDED = 1 << 3,
  GRN_GEO_CURSOR_ENTRY_STATUS_LATITUDE_INNER = 1 << 4,
  GRN_GEO_CURSOR_ENTRY_STATUS_LONGITUDE_INNER = 1 << 5
} grn_geo_cursor_entry_status_flag;

typedef enum {
  GRN_GEO_AREA_NORTH_EAST,
  GRN_GEO_AREA_NORTH_WEST,
  GRN_GEO_AREA_SOUTH_WEST,
  GRN_GEO_AREA_SOUTH_EAST,
  GRN_GEO_AREA_LAST
} grn_geo_area_type;

#define GRN_GEO_N_AREAS GRN_GEO_AREA_LAST

typedef struct {
  uint8_t key[sizeof(grn_geo_point)];
  int target_bit;
  int status_flags;
} grn_geo_cursor_entry;

typedef struct {
  grn_geo_point top_left;
  grn_geo_point bottom_right;
  uint8_t top_left_key[sizeof(grn_geo_point)];
  uint8_t bottom_right_key[sizeof(grn_geo_point)];
  int current_entry;
  grn_geo_cursor_entry entries[GRN_GEO_KEY_MAX_BITS];
} grn_geo_cursor_area;

typedef struct {
  grn_db_obj obj;
  grn_obj *pat;
  grn_obj *index;
  grn_geo_point top_left;
  grn_geo_point bottom_right;
  grn_geo_point center;
  grn_geo_point current;
  bool need_distance;
  grn_table_cursor *pat_cursor;
  grn_ii_cursor *ii_cursor;
  int offset;
  int rest;
  int minimum_reduce_bit;
  grn_geo_area_type current_area;
  grn_geo_cursor_area areas[GRN_GEO_N_AREAS];
} grn_geo_cursor_in_rectangle;

grn_rc
grn_geo_cursor_close(grn_ctx *ctx, grn_obj *geo_cursor);

grn_rc
grn_geo_resolve_approximate_type(grn_ctx *ctx,
                                 grn_obj *type_name,
                                 grn_geo_approximate_type *type);

/**
 * grn_geo_select_in_circle:
 * @index: the index column for TokyoGeoPoint or WGS84GeoPpoint type.
 * @center_point: the center point of the target circle. (ShortText, Text,
 * LongText, TokyoGeoPoint or WGS84GeoPoint)
 * @distance: the radius of the target circle (Int32,
 * UInt32, Int64, UInt64 or Float) or the point
 * on the circumference of the target circle. (ShortText, Text, LongText,
 * TokyoGeoPoint or WGS84GeoPoint)
 * @approximate_type: the approximate type to compute
 * distance.
 * @res: the table to store found record IDs. It must be
 * GRN_TABLE_HASH_KEY type table.
 * @op: the operator for matched records.
 *
 * It selects records that are in the circle specified by
 * @center_point and @distance from @center_point. Records
 * are searched by @index. Found records are added to @res
 * table with @op operation.
 **/
grn_rc
grn_geo_select_in_circle(grn_ctx *ctx,
                         grn_obj *index,
                         grn_obj *center_point,
                         grn_obj *distance,
                         grn_geo_approximate_type approximate_type,
                         grn_obj *res,
                         grn_operator op);

grn_rc
grn_selector_geo_in_circle(grn_ctx *ctx,
                           grn_obj *table,
                           grn_obj *index,
                           int nargs,
                           grn_obj **args,
                           grn_obj *res,
                           grn_operator op);
grn_rc
grn_selector_geo_in_rectangle(grn_ctx *ctx,
                              grn_obj *table,
                              grn_obj *index,
                              int nargs,
                              grn_obj **args,
                              grn_obj *res,
                              grn_operator op);

GRN_API bool
grn_geo_in_circle(grn_ctx *ctx,
                  grn_obj *point,
                  grn_obj *center,
                  grn_obj *radius_or_point,
                  grn_geo_approximate_type approximate_type);
GRN_API bool
grn_geo_in_rectangle(grn_ctx *ctx,
                     grn_obj *point,
                     grn_obj *top_left,
                     grn_obj *bottom_right);
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,
                 grn_geo_approximate_type type);
GRN_API double
grn_geo_distance_rectangle(grn_ctx *ctx, grn_obj *point1, grn_obj *point2);
GRN_API double
grn_geo_distance_sphere(grn_ctx *ctx, grn_obj *point1, grn_obj *point2);
GRN_API 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);
double
grn_geo_distance_ellipsoid_raw_tokyo(grn_ctx *ctx,
                                     grn_geo_point *point1,
                                     grn_geo_point *point2);
double
grn_geo_distance_ellipsoid_raw_wgs84(grn_ctx *ctx,
                                     grn_geo_point *point1,
                                     grn_geo_point *point2);

#ifdef __cplusplus
}
#endif