geo_coder 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. data/Gemfile +12 -0
  2. data/Gemfile.lock +32 -0
  3. data/History.txt +6 -0
  4. data/Makefile +13 -0
  5. data/Manifest.txt +18 -0
  6. data/README.rdoc +197 -0
  7. data/Rakefile +53 -0
  8. data/TODO.txt +8 -0
  9. data/VERSION +1 -0
  10. data/bin/build_indexes +8 -0
  11. data/bin/rebuild_cluster +22 -0
  12. data/bin/rebuild_metaphones +23 -0
  13. data/bin/tiger_import +59 -0
  14. data/demos/demo/app/ext/geocodewrap.rb +84 -0
  15. data/demos/demo/app/views/index.builder +13 -0
  16. data/demos/demo/app/views/index.erb +71 -0
  17. data/demos/demo/config.ru +12 -0
  18. data/demos/demo/config/bootstraps.rb +130 -0
  19. data/demos/demo/config/geoenvironment.rb +25 -0
  20. data/demos/demo/geocoder_helper.rb +12 -0
  21. data/demos/demo/geocom_geocode.rb +10 -0
  22. data/demos/demo/main.rb +3 -0
  23. data/demos/demo/rakefile.rb +17 -0
  24. data/demos/demo/tmp/restart.txt +0 -0
  25. data/demos/simpledemo/views/index.builder +13 -0
  26. data/demos/simpledemo/views/index.erb +69 -0
  27. data/demos/simpledemo/ws.rb +83 -0
  28. data/doc/Makefile +7 -0
  29. data/doc/html4css1.css +279 -0
  30. data/doc/lookup.rst +193 -0
  31. data/doc/parsing.rst +125 -0
  32. data/doc/voidspace.css +147 -0
  33. data/geo_coder.gemspec +172 -0
  34. data/lib/geocoder/us.rb +21 -0
  35. data/lib/geocoder/us/address.rb +290 -0
  36. data/lib/geocoder/us/constants.rb +670 -0
  37. data/lib/geocoder/us/database.rb +745 -0
  38. data/lib/geocoder/us/import.rb +181 -0
  39. data/lib/geocoder/us/import/tiger.rb +13 -0
  40. data/lib/geocoder/us/numbers.rb +58 -0
  41. data/navteq/README +4 -0
  42. data/navteq/convert.sql +37 -0
  43. data/navteq/navteq_import +39 -0
  44. data/navteq/prepare.sql +92 -0
  45. data/sql/cluster.sql +16 -0
  46. data/sql/convert.sql +80 -0
  47. data/sql/create.sql +37 -0
  48. data/sql/index.sql +12 -0
  49. data/sql/place.csv +104944 -0
  50. data/sql/place.sql +104948 -0
  51. data/sql/setup.sql +78 -0
  52. data/src/Makefile +13 -0
  53. data/src/README +14 -0
  54. data/src/liblwgeom/Makefile +75 -0
  55. data/src/liblwgeom/box2d.c +54 -0
  56. data/src/liblwgeom/lex.yy.c +4799 -0
  57. data/src/liblwgeom/liblwgeom.h +1405 -0
  58. data/src/liblwgeom/lwalgorithm.c +946 -0
  59. data/src/liblwgeom/lwalgorithm.h +52 -0
  60. data/src/liblwgeom/lwcircstring.c +759 -0
  61. data/src/liblwgeom/lwcollection.c +541 -0
  62. data/src/liblwgeom/lwcompound.c +118 -0
  63. data/src/liblwgeom/lwcurvepoly.c +86 -0
  64. data/src/liblwgeom/lwgeom.c +886 -0
  65. data/src/liblwgeom/lwgeom_api.c +2201 -0
  66. data/src/liblwgeom/lwgparse.c +1219 -0
  67. data/src/liblwgeom/lwgunparse.c +1054 -0
  68. data/src/liblwgeom/lwline.c +525 -0
  69. data/src/liblwgeom/lwmcurve.c +125 -0
  70. data/src/liblwgeom/lwmline.c +137 -0
  71. data/src/liblwgeom/lwmpoint.c +138 -0
  72. data/src/liblwgeom/lwmpoly.c +141 -0
  73. data/src/liblwgeom/lwmsurface.c +129 -0
  74. data/src/liblwgeom/lwpoint.c +439 -0
  75. data/src/liblwgeom/lwpoly.c +579 -0
  76. data/src/liblwgeom/lwsegmentize.c +1047 -0
  77. data/src/liblwgeom/lwutil.c +369 -0
  78. data/src/liblwgeom/measures.c +861 -0
  79. data/src/liblwgeom/postgis_config.h +93 -0
  80. data/src/liblwgeom/ptarray.c +847 -0
  81. data/src/liblwgeom/vsprintf.c +179 -0
  82. data/src/liblwgeom/wktparse.h +126 -0
  83. data/src/liblwgeom/wktparse.lex +74 -0
  84. data/src/liblwgeom/wktparse.tab.c +2353 -0
  85. data/src/liblwgeom/wktparse.tab.h +145 -0
  86. data/src/liblwgeom/wktparse.y +385 -0
  87. data/src/libsqlite3_geocoder/Makefile +22 -0
  88. data/src/libsqlite3_geocoder/Makefile.nix +15 -0
  89. data/src/libsqlite3_geocoder/Makefile.redhat +15 -0
  90. data/src/libsqlite3_geocoder/extension.c +121 -0
  91. data/src/libsqlite3_geocoder/extension.h +13 -0
  92. data/src/libsqlite3_geocoder/levenshtein.c +42 -0
  93. data/src/libsqlite3_geocoder/metaphon.c +278 -0
  94. data/src/libsqlite3_geocoder/util.c +37 -0
  95. data/src/libsqlite3_geocoder/wkb_compress.c +54 -0
  96. data/src/metaphone/Makefile +7 -0
  97. data/src/metaphone/README +49 -0
  98. data/src/metaphone/extension.c +37 -0
  99. data/src/metaphone/metaphon.c +251 -0
  100. data/src/shp2sqlite/Makefile +37 -0
  101. data/src/shp2sqlite/Makefile.nix +36 -0
  102. data/src/shp2sqlite/Makefile.redhat +35 -0
  103. data/src/shp2sqlite/dbfopen.c +1595 -0
  104. data/src/shp2sqlite/getopt.c +695 -0
  105. data/src/shp2sqlite/getopt.h +127 -0
  106. data/src/shp2sqlite/shapefil.h +500 -0
  107. data/src/shp2sqlite/shp2sqlite.c +1974 -0
  108. data/src/shp2sqlite/shpopen.c +1894 -0
  109. data/tests/address.rb +236 -0
  110. data/tests/benchmark.rb +20 -0
  111. data/tests/constants.rb +57 -0
  112. data/tests/data/address-sample.csv +52 -0
  113. data/tests/data/db-test.csv +57 -0
  114. data/tests/data/locations.csv +4 -0
  115. data/tests/database.rb +137 -0
  116. data/tests/generate.rb +34 -0
  117. data/tests/numbers.rb +46 -0
  118. data/tests/run.rb +11 -0
  119. metadata +237 -0
@@ -0,0 +1,37 @@
1
+ # include <string.h>
2
+ # include <ctype.h>
3
+
4
+ int address_metaphone(const char *input, char *output, int max_phones) {
5
+ const char *n = input;
6
+ int i = 0;
7
+ if (isdigit(*n)) {
8
+ while (i < max_phones && isdigit(n[i]) && n[i] != '\0')
9
+ *output++ = n[i++];
10
+ *output = '\0';
11
+ return 1;
12
+ } else {
13
+ return metaphone(input, output, max_phones);
14
+ }
15
+ }
16
+
17
+ signed int rindex_nondigit (const char *string) {
18
+ signed int i = strlen(string);
19
+ if (!i) return -1;
20
+ for (i--; i >= 0 && isdigit(string[i]); i--);
21
+ return i;
22
+ }
23
+
24
+ signed int digit_suffix (const char *input, char *output) {
25
+ signed int i = rindex_nondigit(input);
26
+ strcpy(output, input+i+1);
27
+ return strlen(output);
28
+ }
29
+
30
+ signed int nondigit_prefix (const char *input, char *output) {
31
+ signed int i = rindex_nondigit(input);
32
+ if (i++ >= 0) {
33
+ strncpy(output, input, i);
34
+ output[i] = '\0';
35
+ }
36
+ return i;
37
+ }
@@ -0,0 +1,54 @@
1
+ #include <stdint.h>
2
+ #include <string.h>
3
+
4
+ uint32_t compress_wkb_line (void *dest, const void *src, uint32_t len) {
5
+ uint32_t d, s;
6
+ double value;
7
+ if (!len) return 0;
8
+ for (s = 9, d = 0; s < len; d += 4, s += 8) {
9
+ value = *(double *)(src + s);
10
+ value *= 1000000;
11
+ *(int32_t *)(dest + d) = (int32_t) value;
12
+ }
13
+ return d;
14
+ }
15
+
16
+ uint32_t uncompress_wkb_line (void *dest, const void *src, uint32_t len) {
17
+ uint32_t d, s;
18
+ double value;
19
+ if (!len) return 0;
20
+ memcpy(dest, "\01\02\00\00\00\06\00\00\00", 10);
21
+ for (s = 0, d = 9; s < len; s += 4, d += 8) {
22
+ value = (double) *(int32_t *)(src + s);
23
+ value /= 1000000;
24
+ *(double *)(dest + d) = value;
25
+ }
26
+ return d;
27
+ }
28
+
29
+
30
+ #ifdef TEST
31
+
32
+ #include <stdio.h>
33
+ int main (int argc, char *argv) {
34
+ char hex[1024], *scan;
35
+ char wkb[512];
36
+ unsigned long len, clen;
37
+
38
+ while (!feof(stdin)) {
39
+ fgets(hex, sizeof(hex), stdin);
40
+ for (scan = hex, len = 0; *scan && sizeof(wkb)>len; scan += 2, len++) {
41
+ if (sscanf(scan, "%2x", (uint32_t *)(wkb+len)) != 1) break;
42
+ }
43
+ clen = compress_wkb_line(hex, wkb, len);
44
+ printf("before: %lu, after: %lu\n", len, clen);
45
+ len = uncompress_wkb_line(wkb, hex, clen);
46
+ printf("before: %lu, after: %lu\n", clen, len);
47
+ for (scan = wkb + 9; scan < wkb + len; scan += 8) {
48
+ printf("%.6f ", *(double *)scan);
49
+ }
50
+ printf("\n");
51
+ }
52
+ }
53
+
54
+ #endif
@@ -0,0 +1,7 @@
1
+ all: metaphone.so
2
+
3
+ metaphone.so: extension.o metaphon.o
4
+ $(CC) -shared $^ -o $@
5
+
6
+ clean:
7
+ rm -f *.o *.so
@@ -0,0 +1,49 @@
1
+ = SQLite 3 Metaphone extension =
2
+
3
+ * This library implements the Metaphone algorithm, originally developed by
4
+ Laurence Phillips, as an SQLite 3 extension function:
5
+
6
+ http://en.wikipedia.org/wiki/Metaphone
7
+
8
+ * This code is based around the original public domain implementation in
9
+ C by Gary Phillips, as provided by Sadi Evren Seker:
10
+
11
+ http://www.shedai.net/c/new/METAPHON.C
12
+
13
+ * Like SQLite and the Phillips implementation of Metaphone, this code
14
+ is provided in the public domain, in the hope that it will be useful.
15
+
16
+ * To compile the code, simply run `make`. You must have GNU Make and GCC
17
+ installed.
18
+
19
+ * The module implements one function, metaphone(), which takes a string
20
+ to convert to a metaphone representation as its first argument, and an
21
+ optional second argument to specify the maximum length of the output.
22
+
23
+ * To use the code, run `sqlite3` and enter the following:
24
+
25
+ {{{
26
+ sqlite> .load /path/to/metaphone.so
27
+ -- you can use ./metaphone.so if the .so is in your
28
+ -- current directory, or just metaphone.so if it's
29
+ -- somewhere in your library path.
30
+ sqlite> select metaphone("Schuyler");
31
+ SKLR
32
+ sqlite> select metaphone("Schuyler", 3);
33
+ SKL
34
+ sqlite> select metaphone("Skyler");
35
+ SKLR
36
+ sqlite> select metaphone("Skylar");
37
+ SKLR
38
+ sqlite> select metaphone("SQLite rules!");
39
+ SKLTRLS
40
+ sqlite> select metaphone("SQLite roolz!!!1!");
41
+ SKLTRLS
42
+ }}}
43
+
44
+ Questions? Comments? Complaints? Approbation? Email schuyler@nocat.net.
45
+
46
+ Schuyler Erle
47
+ 9 March 2008
48
+
49
+ =30=
@@ -0,0 +1,37 @@
1
+ # include <sqlite3.h>
2
+ # include <sqlite3ext.h>
3
+ # include <stdio.h>
4
+ # include <string.h>
5
+
6
+ static SQLITE_EXTENSION_INIT1;
7
+
8
+ static void
9
+ sqlite3_metaphone (sqlite3_context *context, int argc, sqlite3_value **argv) {
10
+ const unsigned char *input = sqlite3_value_text(argv[0]);
11
+ int max_phones = 0;
12
+ char *output;
13
+ int len;
14
+ if (sqlite3_value_type(argv[0]) == SQLITE_NULL) {
15
+ sqlite3_result_null(context);
16
+ return;
17
+ }
18
+ if (argc > 1)
19
+ max_phones = sqlite3_value_int(argv[1]);
20
+ if (max_phones <= 0)
21
+ max_phones = strlen(input);
22
+ output = sqlite3_malloc((max_phones+1)*sizeof(char));
23
+ len = metaphone(input, output, max_phones);
24
+ sqlite3_result_text(context, output, len, SQLITE_TRANSIENT);
25
+ }
26
+
27
+ int sqlite3_extension_init (sqlite3 * db, char **pzErrMsg,
28
+ const sqlite3_api_routines *pApi) {
29
+ SQLITE_EXTENSION_INIT2(pApi);
30
+ sqlite3_create_function(db, "metaphone", 1, SQLITE_ANY,
31
+ NULL, sqlite3_metaphone, NULL, NULL);
32
+ sqlite3_create_function(db, "metaphone", 2, SQLITE_ANY,
33
+ NULL, sqlite3_metaphone, NULL, NULL);
34
+ return 0;
35
+ }
36
+
37
+
@@ -0,0 +1,251 @@
1
+ /* +++Customized by SDE for sqlite3 use 09-Mar-2009 */
2
+ /* +++File obtained from http://www.shedai.net/c/new/METAPHON.C */
3
+ /* +++Date previously modified: 05-Jul-1997 */
4
+
5
+ /*
6
+ ** METAPHON.C - Phonetic string matching
7
+ **
8
+ ** The Metaphone algorithm was developed by Lawrence Phillips. Like the
9
+ ** Soundex algorithm, it compares words that sound alike but are spelled
10
+ ** differently. Metaphone was designed to overcome difficulties encountered
11
+ ** with Soundex.
12
+ **
13
+ ** This implementation was written by Gary A. Parker and originally published
14
+ ** in the June/July, 1991 (vol. 5 nr. 4) issue of C Gazette. As published,
15
+ ** this code was explicitly placed in the public domain by the author.
16
+ */
17
+
18
+ #include <ctype.h>
19
+ #include <string.h> /* strlen() */
20
+ #include <stdio.h>
21
+ #define malloc(x) sqlite3_malloc((x))
22
+ #define free(x) sqlite3_free((x))
23
+
24
+ /*
25
+ ** Character coding array
26
+ */
27
+
28
+ static char vsvfn[26] = {
29
+ 1,16,4,16,9,2,4,16,9,2,0,2,2,2,1,4,0,2,4,4,1,0,0,0,8,0};
30
+ /* A B C D E F G H I J K L M N O P Q R S T U V W X Y Z */
31
+
32
+ /*
33
+ ** Macros to access the character coding array
34
+ */
35
+
36
+ #define vowel(x) (vsvfn[(x) - 'A'] & 1) /* AEIOU */
37
+ #define same(x) (vsvfn[(x) - 'A'] & 2) /* FJLMNR */
38
+ #define varson(x) (vsvfn[(x) - 'A'] & 4) /* CGPST */
39
+ #define frontv(x) (vsvfn[(x) - 'A'] & 8) /* EIY */
40
+ #define noghf(x) (vsvfn[(x) - 'A'] & 16) /* BDH */
41
+
42
+ int metaphone(const char *Word, char *Metaph, int max_phones)
43
+ {
44
+ char *n, *n_start, *n_end; /* Pointers to string */
45
+ char *metaph_start = Metaph, *metaph_end;
46
+ /* Pointers to metaph */
47
+ int ntrans_len = strlen(Word)+4;
48
+ char *ntrans = (char *)malloc(sizeof(char) * ntrans_len);
49
+ /* Word with uppercase letters */
50
+ int KSflag; /* State flag for X translation */
51
+
52
+ /*
53
+ ** Copy word to internal buffer, dropping non-alphabetic characters
54
+ ** and converting to upper case.
55
+ */
56
+
57
+ for (n = ntrans + 1, n_end = ntrans + ntrans_len - 2;
58
+ *Word && n < n_end; ++Word)
59
+ {
60
+ if (isalpha(*Word))
61
+ *n++ = toupper(*Word);
62
+ }
63
+
64
+ if (n == ntrans + 1) {
65
+ free(ntrans);
66
+ Metaph[0]='\0';
67
+ return 1; /* Return if zero characters */
68
+ }
69
+ else n_end = n; /* Set end of string pointer */
70
+
71
+ /*
72
+ ** Pad with '\0's, front and rear
73
+ */
74
+
75
+ *n++ = '\0';
76
+ *n = '\0';
77
+ n = ntrans;
78
+ *n++ = '\0';
79
+
80
+ /*
81
+ ** Check for PN, KN, GN, WR, WH, and X at start
82
+ */
83
+
84
+ switch (*n)
85
+ {
86
+ case 'P':
87
+ case 'K':
88
+ case 'G':
89
+ if ('N' == *(n + 1))
90
+ *n++ = '\0';
91
+ break;
92
+
93
+ case 'A':
94
+ if ('E' == *(n + 1))
95
+ *n++ = '\0';
96
+ break;
97
+
98
+ case 'W':
99
+ if ('R' == *(n + 1))
100
+ *n++ = '\0';
101
+ else if ('H' == *(n + 1))
102
+ {
103
+ *(n + 1) = *n;
104
+ *n++ = '\0';
105
+ }
106
+ break;
107
+
108
+ case 'X':
109
+ *n = 'S';
110
+ break;
111
+ }
112
+
113
+ /*
114
+ ** Now loop through the string, stopping at the end of the string
115
+ ** or when the computed Metaphone code is max_phones characters long.
116
+ */
117
+
118
+ KSflag = 0; /* State flag for KStranslation */
119
+ for (metaph_end = Metaph + max_phones, n_start = n;
120
+ n <= n_end && Metaph < metaph_end; ++n)
121
+ {
122
+ if (KSflag)
123
+ {
124
+ KSflag = 0;
125
+ *Metaph++ = *n;
126
+ }
127
+ else
128
+ {
129
+ /* Drop duplicates except for CC */
130
+
131
+ if (*(n - 1) == *n && *n != 'C')
132
+ continue;
133
+
134
+ /* Check for F J L M N R or first letter vowel */
135
+
136
+ if (same(*n) || (n == n_start && vowel(*n)))
137
+ *Metaph++ = *n;
138
+ else switch (*n)
139
+ {
140
+ case 'B':
141
+ if (n < n_end || *(n - 1) != 'M')
142
+ *Metaph++ = *n;
143
+ break;
144
+
145
+ case 'C':
146
+ if (*(n - 1) != 'S' || !frontv(*(n + 1)))
147
+ {
148
+ if ('I' == *(n + 1) && 'A' == *(n + 2))
149
+ *Metaph++ = 'X';
150
+ else if (frontv(*(n + 1)))
151
+ *Metaph++ = 'S';
152
+ else if ('H' == *(n + 1))
153
+ *Metaph++ = ((n == n_start &&
154
+ !vowel(*(n + 2))) ||
155
+ 'S' == *(n - 1)) ? 'K' : 'X';
156
+ else *Metaph++ = 'K';
157
+ }
158
+ break;
159
+
160
+ case 'D':
161
+ *Metaph++ = ('G' == *(n + 1) && frontv(*(n + 2))) ?
162
+ 'J' : 'T';
163
+ break;
164
+
165
+ case 'G':
166
+ if ((*(n + 1) != 'H' || vowel(*(n + 2))) &&
167
+ (*(n + 1) != 'N' || ((n + 1) < n_end &&
168
+ (*(n + 2) != 'E' || *(n + 3) != 'D'))) &&
169
+ (*(n - 1) != 'D' || !frontv(*(n + 1))))
170
+ {
171
+ *Metaph++ = (frontv(*(n + 1)) &&
172
+ *(n + 2) != 'G') ? 'J' : 'K';
173
+ }
174
+ else if ('H' == *(n + 1) && !noghf(*(n - 3)) &&
175
+ *(n - 4) != 'H')
176
+ {
177
+ *Metaph++ = 'F';
178
+ }
179
+ break;
180
+
181
+ case 'H':
182
+ if (!varson(*(n - 1)) && (!vowel(*(n - 1)) ||
183
+ vowel(*(n + 1))))
184
+ {
185
+ *Metaph++ = 'H';
186
+ }
187
+ break;
188
+
189
+ case 'K':
190
+ if (*(n - 1) != 'C')
191
+ *Metaph++ = 'K';
192
+ break;
193
+
194
+ case 'P':
195
+ *Metaph++ = ('H' == *(n + 1)) ? 'F' : 'P';
196
+ break;
197
+
198
+ case 'Q':
199
+ *Metaph++ = 'K';
200
+ break;
201
+
202
+ case 'S':
203
+ *Metaph++ = ('H' == *(n + 1) || ('I' == *(n + 1) &&
204
+ ('O' == *(n + 2) || 'A' == *(n + 2)))) ?
205
+ 'X' : 'S';
206
+ break;
207
+
208
+ case 'T':
209
+ if ('I' == *(n + 1) && ('O' == *(n + 2) ||
210
+ 'A' == *(n + 2)))
211
+ {
212
+ *Metaph++ = 'X';
213
+ }
214
+ else if ('H' == *(n + 1))
215
+ *Metaph++ = 'O';
216
+ else if (*(n + 1) != 'C' || *(n + 2) != 'H')
217
+ *Metaph++ = 'T';
218
+ break;
219
+
220
+ case 'V':
221
+ *Metaph++ = 'F';
222
+ break;
223
+
224
+ case 'W':
225
+ case 'Y':
226
+ if (vowel(*(n + 1)))
227
+ *Metaph++ = *n;
228
+ break;
229
+
230
+ case 'X':
231
+ if (n == n_start)
232
+ *Metaph++ = 'S';
233
+ else
234
+ {
235
+ *Metaph++ = 'K';
236
+ KSflag = 1;
237
+ }
238
+ break;
239
+
240
+ case 'Z':
241
+ *Metaph++ = 'S';
242
+ break;
243
+ }
244
+ }
245
+ }
246
+
247
+ *Metaph = '\0';
248
+ free(ntrans);
249
+ return strlen(metaph_start);
250
+ }
251
+
@@ -0,0 +1,37 @@
1
+ # **********************************************************************
2
+ # * $Id: Makefile.in
3
+ # *
4
+ # * PostGIS - Spatial Types for PostgreSQL
5
+ # * http://postgis.refractions.net
6
+ # * Copyright 2008 Mark Cave-Ayland
7
+ # *
8
+ # * This is free software; you can redistribute and/or modify it under
9
+ # * the terms of the GNU General Public Licence. See the COPYING file.
10
+ # *
11
+ # **********************************************************************
12
+
13
+ CC=gcc
14
+ CFLAGS=-g -O2 -fPIC -DPIC -Wall -Wmissing-prototypes
15
+
16
+ # Filenames with extension as determined by the OS
17
+ SHP2SQLITE=shp2sqlite
18
+ LIBLWGEOM=../liblwgeom/liblwgeom.a
19
+
20
+ # iconv flags
21
+ ICONV_LDFLAGS=-lc
22
+
23
+ all: $(SHP2SQLITE)
24
+
25
+ $(LIBLWGEOM):
26
+ make -C ../liblwgeom
27
+
28
+ $(SHP2SQLITE): shpopen.o dbfopen.o getopt.o shp2sqlite.o $(LIBLWGEOM)
29
+ $(CC) -L/usr/local/libiconv/lib/ -liconv -I/usr/include $(CFLAGS) $^ $(ICONV_LDFLAGS) -lm -o $@
30
+
31
+
32
+ install: all
33
+ @cp $(SHP2SQLITE) ../../bin
34
+
35
+ clean:
36
+ @rm -f *.o $(SHP2SQLITE)
37
+