geo_coder 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+