/[zanavi_public1]/navit/navit/tools/gpx2navit_txt/src/setpath.c
ZANavi

Contents of /navit/navit/tools/gpx2navit_txt/src/setpath.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2 - (show annotations) (download)
Fri Oct 28 21:19:04 2011 UTC (12 years, 5 months ago) by zoff99
File MIME type: text/plain
File size: 7007 byte(s)
import files
1 /**
2 * Navit, a modular navigation system.
3 * Copyright (C) 2005-2008 Navit Team
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * version 2 as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
20 #include "gpx2navit_txt.h"
21
22 void initPathAttr(pathattr * pattr, g2sattr * attr);
23 void setEdge(parsedata * pdata, double _x, double _y, double _z,
24 double length, double interval, double speed);
25 void setPathInterval(parsedata * pdata);
26 void setPathData(pathattr * pattr, g2sattr * attr);
27 void countUnconverted(parsedata * pdata);
28 void countPath(parsedata * pdata);
29 int checkPath(parsedata * pdata);
30 void setPath( parsedata * pdata);
31
32
33
34 /**
35 * initialize a path attribute
36 */
37 void initPathAttr(pathattr * pattr, g2sattr * attr)
38 {
39 strcpy(pattr->name, attr->name);
40 strcpy(pattr->cmt, attr->cmt);
41 strcpy(pattr->desc, attr->desc);
42 strcpy(pattr->src, attr->src);
43 strcpy(pattr->link, attr->link);
44 pattr->number = attr->number;
45 strcpy(pattr->type, attr->type);
46 pattr->length = 0;
47 pattr->interval = 0;
48 pattr->speed = 0;
49 pattr->count = 0;
50 pattr->point = NULL;
51 }
52
53
54 /**
55 * set edge data and store it
56 */
57 void setEdge(parsedata * pdata, double _x, double _y, double _z,
58 double length, double interval, double speed)
59 {
60 pathattr *pattr = pdata->pattr;
61 static int isFirstTrkAsEdge = 1;
62 static int isFirstRteAsEdge = 1;
63 double x[2], y[2], z[2];
64 double _length, _interval, _speed;
65 if (!strcmp(pdata->current->name, "trkpt")) {
66 if (isFirstTrkAsEdge) {
67 isFirstTrkAsEdge = 0;
68 }
69 } else {
70 if (isFirstRteAsEdge) {
71 isFirstRteAsEdge = 0;
72 }
73 }
74 _length = pattr->length;
75 _interval = pattr->interval;
76 _speed = pattr->speed;
77 pattr->length = length;
78 pattr->interval = interval;
79 pattr->speed = speed;
80 x[0] = _x;
81 y[0] = _y;
82 z[0] = _z;
83 x[1] = pdata->attr->lon;
84 y[1] = pdata->attr->lat;
85 z[1] = pdata->attr->ele;
86 if (pdata->prop->is3d) {
87 } else {
88 }
89 pattr->length = _length;
90 pattr->interval = _interval;
91 pattr->speed = _speed;
92 }
93
94 /**
95 * sets interval data between two track points
96 */
97 void setPathInterval(parsedata * pdata)
98 {
99 pathattr *pattr = pdata->pattr;
100 g2sattr *attr = pdata->attr;
101 g2sprop *prop = pdata->prop;
102 static char _t[TIMELENGTH];
103 double intvl = 0;
104 static double _x, _y, _z;
105 double leng = 0;
106 double spd;
107 if (pattr->count == 1) {
108 strcpy(_t, attr->time);
109 } else {
110 /* time interval */
111 intvl = getTimeInterval(_t, attr->time);
112 pattr->interval = pattr->interval + intvl;
113 strcpy(_t, attr->time);
114 /* length interval */
115 leng = getDistance(_x, _y, attr->lon, attr->lat);
116 pattr->length = pattr->length + leng;
117 /* interval speed */
118 spd = getSpeed(leng, intvl, prop->speed2meter, prop->speed2sec);
119 /* sets edge data */
120 if (prop->isEdge) {
121 setEdge(pdata, _x, _y, _z, leng, intvl, spd);
122 }
123 }
124 _x = attr->lon;
125 _y = attr->lat;
126 _z = attr->ele;
127 }
128
129 /**
130 * sets each track point data in array.
131 */
132 void setPathData(pathattr * pattr, g2sattr * attr)
133 {
134 const int reallocsize = 100;
135 if (pattr->count == 0) {
136 pattr->point = malloc(sizeof(double) * 3 * reallocsize);
137 }
138 if ((pattr->count % reallocsize) == 0) {
139 pattr->point = realloc(pattr->point,
140 sizeof(double) * 3 * (pattr->count +
141 reallocsize));
142 }
143 pattr->point[pattr->count * 3] = attr->lon;
144 pattr->point[pattr->count * 3 + 1] = attr->lat;
145 pattr->point[pattr->count * 3 + 2] = attr->ele;
146 pattr->count++;
147 }
148
149 /**
150 * counts paths that wasn't converted
151 */
152 void countUnconverted(parsedata * pdata)
153 {
154 g2sstats *stats = pdata->prop->stats;
155 if (!strcmp(pdata->current->name, "trkseg"))
156 stats->trkunconverted++;
157 else
158 stats->rteunconverted++;
159 }
160
161 /**
162 * counts paths
163 */
164 void countPath(parsedata * pdata)
165 {
166 g2sstats *stats = pdata->prop->stats;
167 pathattr *pattr = pdata->pattr;
168 if (!strcmp(pdata->current->name, "trkseg")) {
169 stats->trkcount++;
170 stats->trklength += pattr->length;
171 stats->trkpoints += pattr->count;
172 } else {
173 stats->rtecount++;
174 stats->rtelength += pattr->length;
175 stats->rtepoints += pattr->count;
176 }
177 }
178
179 int checkPath(parsedata * pdata)
180 {
181 pathattr *pattr = pdata->pattr;
182 g2sprop *prop = pdata->prop;
183 /* check point count. */
184 if (pattr->count < prop->minpoints) {
185 fprintf
186 (stderr,
187 "gpx2navit_txt:%s:%i track was not converted because of less then %d points. \n",
188 prop->sourcefile, XML_GetCurrentLineNumber(pdata->parser),
189 prop->minpoints);
190 countUnconverted(pdata);
191 return 0;
192 /* check path length */
193 } else if (pattr->length < prop->minlength * prop->length2meter) {
194 fprintf
195 (stderr,
196 "gpx2navit_txt:%s:%i track was not converted because it is shorter than %dm.\n",
197 prop->sourcefile, XML_GetCurrentLineNumber(pdata->parser),
198 prop->minlength);
199 countUnconverted(pdata);
200 return 0;
201 /* check path time */
202 } else if (pattr->interval < prop->mintime * prop->time2sec) {
203 fprintf
204 (stderr,
205 "gpx2navit_txt:%s:%i track was not converted because it is shorter than %d sed.\n",
206 prop->sourcefile, XML_GetCurrentLineNumber(pdata->parser),
207 prop->mintime);
208 countUnconverted(pdata);
209 return 0;
210 /* check path speed */
211 } else if (pattr->speed == .0) {
212 fprintf
213 (stderr,
214 "gpx2navit_txt:%s:%i track was not converted because no move recorded.\n",
215 prop->sourcefile, XML_GetCurrentLineNumber(pdata->parser));
216 countUnconverted(pdata);
217 return 0;
218 }
219 return 1;
220 }
221
222 /**
223 * saves path data into files.
224 */
225 void setPath( parsedata * pdata)
226 {
227 pathattr *pattr = pdata->pattr;
228 g2sprop *prop = pdata->prop;
229 int isOk = 0;
230 pattr->speed =
231 getSpeed(pattr->length, pattr->interval, prop->speed2meter,
232 prop->speed2sec);
233 if (prop->isFast) {
234 isOk = 1;
235 } else {
236 isOk = checkPath(pdata);
237 }
238 if (isOk) {
239 double x[pattr->count];
240 double y[pattr->count];
241 double z[pattr->count];
242 int i;
243 fprintf(pdata->fp,"type=track label=\"%s\" desc=\"%s\" type=\"%s\"\ length=\"%5.3f\" count=\"%5d\"\n"
244 ,pdata->pattr->name,pdata->pattr->desc,
245 pdata->pattr->type,pdata->pattr->length,
246 pdata->pattr->count);
247
248 for (i = 0; i < pattr->count; i++) {
249 x[i] = pattr->point[i * 3];
250 y[i] = pattr->point[i * 3 + 1];
251 z[i] = pattr->point[i * 3 + 2];
252 fprintf(pdata->fp,"%3.6f %4.6f\n",x[i],y[i]);
253 }
254 if (pdata->prop->is3d) {
255 } else {
256 }
257 countPath(pdata);
258 }
259 free(pattr->point);
260 }

   
Visit the ZANavi Wiki