diff --git a/formspec.h b/formspec.h index 942e596aa..44261561c 100644 --- a/formspec.h +++ b/formspec.h @@ -26,6 +26,7 @@ enum FsType { kFsUnknown = 0L, kFsGpx = 0x67707800L, + kFsGpxWpt = 0x67707877L, kFsOzi = 0x6f7a6900L, kFsGmsd = 0x474d5344L, /* GMSD = Garmin specific data */ kFsQstarzBl1000 = 0x5173747aL, diff --git a/gpx.cc b/gpx.cc index 9b8c8738f..1439a5f0c 100644 --- a/gpx.cc +++ b/gpx.cc @@ -514,6 +514,10 @@ GpxFormat::gpx_end(QStringView /*unused*/) delete link_; link_ = nullptr; } + if (wpt_fsdata != nullptr) { + wpt_tmp->fs.FsChainAdd(wpt_fsdata); + wpt_fsdata = nullptr; + } waypt_add(wpt_tmp); logpoint_ct = 0; cur_tag = nullptr; @@ -621,6 +625,10 @@ GpxFormat::gpx_end(QStringView /*unused*/) delete link_; link_ = nullptr; } + if (wpt_fsdata != nullptr) { + wpt_tmp->fs.FsChainAdd(wpt_fsdata); + wpt_fsdata = nullptr; + } route_add_wpt(rte_head, wpt_tmp); wpt_tmp = nullptr; break; @@ -665,6 +673,10 @@ GpxFormat::gpx_end(QStringView /*unused*/) delete link_; link_ = nullptr; } + if (wpt_fsdata != nullptr) { + wpt_tmp->fs.FsChainAdd(wpt_fsdata); + wpt_fsdata = nullptr; + } track_add_wpt(trk_head, wpt_tmp); wpt_tmp = nullptr; break; @@ -727,6 +739,12 @@ GpxFormat::gpx_end(QStringView /*unused*/) case tt_wpttype_time: wpt_tmp->SetCreationTime(xml_parse_time(cdatastr)); break; + case tt_wpttype_magvar: + if (wpt_fsdata == nullptr) { + wpt_fsdata = new gpx_wpt_fsdata; + } + wpt_fsdata->magvar = cdatastr; + break; case tt_wpttype_geoidheight: wpt_tmp->set_geoidheight(cdatastr.toDouble()); break; @@ -736,6 +754,18 @@ GpxFormat::gpx_end(QStringView /*unused*/) case tt_wpttype_desc: wpt_tmp->notes = cdatastr; break; + case tt_wpttype_src: + if (wpt_fsdata == nullptr) { + wpt_fsdata = new gpx_wpt_fsdata; + } + wpt_fsdata->src = cdatastr; + break; + case tt_wpttype_type: + if (wpt_fsdata == nullptr) { + wpt_fsdata = new gpx_wpt_fsdata; + } + wpt_fsdata->type = cdatastr; + break; case tt_wpttype_pdop: wpt_tmp->pdop = cdatastr.toFloat(); break; @@ -745,6 +775,18 @@ GpxFormat::gpx_end(QStringView /*unused*/) case tt_wpttype_vdop: wpt_tmp->vdop = cdatastr.toFloat(); break; + case tt_wpttype_ageofdgpsdata: + if (wpt_fsdata == nullptr) { + wpt_fsdata = new gpx_wpt_fsdata; + } + wpt_fsdata->ageofdgpsdata = cdatastr; + break; + case tt_wpttype_dgpsid: + if (wpt_fsdata == nullptr) { + wpt_fsdata = new gpx_wpt_fsdata; + } + wpt_fsdata->dgpsid = cdatastr; + break; case tt_wpttype_sat: wpt_tmp->sat = cdatastr.toInt(); break; @@ -1065,7 +1107,7 @@ GpxFormat::write_attributes(const QXmlStreamAttributes& attributes) const } void -GpxFormat::fprint_xml_chain(XmlTag* tag, const Waypoint* wpt) const +GpxFormat::fprint_xml_chain(XmlTag* tag) const { while (tag) { writer->writeStartElement(tag->tagname); @@ -1078,7 +1120,7 @@ GpxFormat::fprint_xml_chain(XmlTag* tag, const Waypoint* wpt) const writer->writeCharacters(tag->cdata); } if (tag->child) { - fprint_xml_chain(tag->child, wpt); + fprint_xml_chain(tag->child); } writer->writeEndElement(); } @@ -1138,7 +1180,7 @@ GpxFormat::write_gpx_url(const route_head* rh) const * Order counts. */ void -GpxFormat::gpx_write_common_acc(const Waypoint* waypointp) const +GpxFormat::gpx_write_common_acc(const Waypoint* waypointp, const gpx_wpt_fsdata* fs_gpxwpt) const { const char* fix = nullptr; @@ -1179,13 +1221,15 @@ GpxFormat::gpx_write_common_acc(const Waypoint* waypointp) const if (waypointp->pdop) { writer->writeTextElement(QStringLiteral("pdop"), toString(waypointp->pdop)); } - /* TODO: ageofdgpsdata should go here */ - /* TODO: dgpsid should go here */ + if (fs_gpxwpt) { + writer->writeOptionalTextElement(QStringLiteral("ageofdgpsdata"), fs_gpxwpt->ageofdgpsdata); + writer->writeOptionalTextElement(QStringLiteral("dgpsid"), fs_gpxwpt->dgpsid); + } } void -GpxFormat::gpx_write_common_position(const Waypoint* waypointp, const gpx_point_type point_type) const +GpxFormat::gpx_write_common_position(const Waypoint* waypointp, const gpx_point_type point_type, const gpx_wpt_fsdata* fs_gpxwpt) const { if (waypointp->altitude != unknown_alt) { writer->writeTextElement(QStringLiteral("ele"), QString::number(waypointp->altitude, 'f', elevation_precision)); @@ -1201,7 +1245,9 @@ GpxFormat::gpx_write_common_position(const Waypoint* waypointp, const gpx_point_ writer->writeTextElement(QStringLiteral("speed"), toString(waypointp->speed_value())); } } - /* TODO: magvar should go here */ + if (fs_gpxwpt) { + writer->writeOptionalTextElement(QStringLiteral("magvar"), fs_gpxwpt->magvar); + } if (waypointp->geoidheight_has_value()) { writer->writeOptionalTextElement(QStringLiteral("geoidheight"),QString::number(waypointp->geoidheight_value(), 'f', 1)); } @@ -1294,8 +1340,13 @@ GpxFormat::gpx_write_common_extensions(const Waypoint* waypointp, const gpx_poin } void -GpxFormat::gpx_write_common_description(const Waypoint* waypointp, const QString& oname) const +GpxFormat::gpx_write_common_description(const Waypoint* waypointp, const gpx_point_type point_type, const gpx_wpt_fsdata* fs_gpxwpt) const { + QString oname; + if (!((point_type == gpxpt_track) && waypointp->wpt_flags.shortname_is_synthetic)) { + oname = global_opts.synthesize_shortnames ? + mkshort_handle->mkshort_from_wpt(waypointp) : waypointp->shortname; + } writer->writeOptionalTextElement(QStringLiteral("name"), oname); writer->writeOptionalTextElement(QStringLiteral("cmt"), waypointp->description); @@ -1304,10 +1355,24 @@ GpxFormat::gpx_write_common_description(const Waypoint* waypointp, const QString } else { writer->writeOptionalTextElement(QStringLiteral("desc"), waypointp->description); } - /* TODO: src should go here */ + if (fs_gpxwpt) { + writer->writeOptionalTextElement(QStringLiteral("src"), fs_gpxwpt->src); + } write_gpx_url(waypointp); writer->writeOptionalTextElement(QStringLiteral("sym"), waypointp->icon_descr); - /* TODO: type should go here */ + if (fs_gpxwpt) { + writer->writeOptionalTextElement(QStringLiteral("type"), fs_gpxwpt->type); + } +} + +void GpxFormat::gpx_write_common_core(const Waypoint* waypointp, + const gpx_point_type point_type) const +{ + const auto* fs_gpxwpt = reinterpret_cast(waypointp->fs.FsChainFind(kFsGpxWpt)); + + gpx_write_common_position(waypointp, point_type, fs_gpxwpt); + gpx_write_common_description(waypointp, point_type, fs_gpxwpt); + gpx_write_common_acc(waypointp, fs_gpxwpt); } void @@ -1317,19 +1382,14 @@ GpxFormat::gpx_waypt_pr(const Waypoint* waypointp) const writer->writeAttribute(QStringLiteral("lat"), toString(waypointp->latitude)); writer->writeAttribute(QStringLiteral("lon"), toString(waypointp->longitude)); - QString oname = global_opts.synthesize_shortnames ? - mkshort_handle->mkshort_from_wpt(waypointp) : - waypointp->shortname; - gpx_write_common_position(waypointp, gpxpt_waypoint); - gpx_write_common_description(waypointp, oname); - gpx_write_common_acc(waypointp); + gpx_write_common_core(waypointp, gpxpt_waypoint); if (!(opt_humminbirdext || opt_garminext)) { const auto* fs_gpx = reinterpret_cast(waypointp->fs.FsChainFind(kFsGpx)); auto* gmsd = garmin_fs_t::find(waypointp); /* gARmIN sPECIAL dATA */ if (fs_gpx) { if (! gmsd) { - fprint_xml_chain(fs_gpx->tag, waypointp); + fprint_xml_chain(fs_gpx->tag); } } if (gmsd && (gpx_write_version > gpx_1_0)) { @@ -1360,7 +1420,7 @@ GpxFormat::gpx_track_hdr(const route_head* rte) if (!(opt_humminbirdext || opt_garminext)) { const auto* fs_gpx = reinterpret_cast(rte->fs.FsChainFind(kFsGpx)); if (fs_gpx) { - fprint_xml_chain(fs_gpx->tag, nullptr); + fprint_xml_chain(fs_gpx->tag); } } else if (opt_garminext) { if (rte->line_color.bbggrr > unknown_color) { @@ -1394,20 +1454,12 @@ GpxFormat::gpx_track_disp(const Waypoint* waypointp) const writer->writeAttribute(QStringLiteral("lat"), toString(waypointp->latitude)); writer->writeAttribute(QStringLiteral("lon"), toString(waypointp->longitude)); - gpx_write_common_position(waypointp, gpxpt_track); - - QString oname = global_opts.synthesize_shortnames ? - mkshort_handle->mkshort_from_wpt(waypointp) : - waypointp->shortname; - gpx_write_common_description(waypointp, - waypointp->wpt_flags.shortname_is_synthetic ? - nullptr : oname); - gpx_write_common_acc(waypointp); + gpx_write_common_core(waypointp, gpxpt_track); if (!(opt_humminbirdext || opt_garminext)) { const auto* fs_gpx = reinterpret_cast(waypointp->fs.FsChainFind(kFsGpx)); if (fs_gpx) { - fprint_xml_chain(fs_gpx->tag, waypointp); + fprint_xml_chain(fs_gpx->tag); } } else { gpx_write_common_extensions(waypointp, gpxpt_track); @@ -1458,7 +1510,7 @@ GpxFormat::gpx_route_hdr(const route_head* rte) const if (!(opt_humminbirdext || opt_garminext)) { const auto* fs_gpx = reinterpret_cast(rte->fs.FsChainFind(kFsGpx)); if (fs_gpx) { - fprint_xml_chain(fs_gpx->tag, nullptr); + fprint_xml_chain(fs_gpx->tag); } } else if (opt_garminext) { if (rte->line_color.bbggrr > unknown_color) { @@ -1485,17 +1537,12 @@ GpxFormat::gpx_route_disp(const Waypoint* waypointp) const writer->writeAttribute(QStringLiteral("lat"), toString(waypointp->latitude)); writer->writeAttribute(QStringLiteral("lon"), toString(waypointp->longitude)); - QString oname = global_opts.synthesize_shortnames ? - mkshort_handle->mkshort_from_wpt(waypointp) : - waypointp->shortname; - gpx_write_common_position(waypointp, gpxpt_route); - gpx_write_common_description(waypointp, oname); - gpx_write_common_acc(waypointp); + gpx_write_common_core(waypointp, gpxpt_route); if (!(opt_humminbirdext || opt_garminext)) { const auto* fs_gpx = reinterpret_cast(waypointp->fs.FsChainFind(kFsGpx)); if (fs_gpx) { - fprint_xml_chain(fs_gpx->tag, waypointp); + fprint_xml_chain(fs_gpx->tag); } } else { gpx_write_common_extensions(waypointp, gpxpt_route); diff --git a/gpx.h b/gpx.h index 1fd5b9692..0d56a9f87 100644 --- a/gpx.h +++ b/gpx.h @@ -67,6 +67,28 @@ class GpxFormat : public Format void exit() override; private: + /* + * This structure holds the element contents of elements in the + * the gpx namespace that are only passed from the gpx reader to + * the gpx writer. + * We explcitly write these instead of passing them through so they + * are written in the correct sequence. + */ + struct gpx_wpt_fsdata : FormatSpecificData { + gpx_wpt_fsdata() : FormatSpecificData(kFsGpxWpt) {} + + gpx_wpt_fsdata* clone() const override + { + return new gpx_wpt_fsdata(*this); + } + + QString magvar; + QString src; + QString type; + QString ageofdgpsdata; + QString dgpsid; + }; + enum gpx_point_type { gpxpt_waypoint, gpxpt_track, @@ -91,10 +113,12 @@ class GpxFormat : public Format tt_wpt, tt_wpttype_ele, tt_wpttype_time, + tt_wpttype_magvar, tt_wpttype_geoidheight, tt_wpttype_name, tt_wpttype_cmt, tt_wpttype_desc, + tt_wpttype_src, tt_wpttype_url, /* Not in GPX 1.1 */ tt_wpttype_urlname, /* Not in GPX 1.1 */ tt_wpttype_link, /* New in GPX 1.1 */ @@ -107,6 +131,8 @@ class GpxFormat : public Format tt_wpttype_hdop, /* HDOPS are common for all three */ tt_wpttype_vdop, /* VDOPS are common for all three */ tt_wpttype_pdop, /* PDOPS are common for all three */ + tt_wpttype_ageofdgpsdata, + tt_wpttype_dgpsid, tt_cache, tt_cache_name, tt_cache_container, @@ -197,15 +223,16 @@ class GpxFormat : public Format void gpx_cdata(QStringView s); QString qualifiedName() const; void write_attributes(const QXmlStreamAttributes& attributes) const; - void fprint_xml_chain(XmlTag* tag, const Waypoint* wpt) const; + void fprint_xml_chain(XmlTag* tag) const; void write_gpx_url(const UrlList& urls) const; void write_gpx_url(const Waypoint* waypointp) const; void write_gpx_url(const route_head* rh) const; - void gpx_write_common_acc(const Waypoint* waypointp) const; - void gpx_write_common_position(const Waypoint* waypointp, gpx_point_type point_type) const; + void gpx_write_common_acc(const Waypoint* waypointp, const gpx_wpt_fsdata* fs_gpxwpt) const; + void gpx_write_common_position(const Waypoint* waypointp, gpx_point_type point_type, const gpx_wpt_fsdata* fs_gpxwpt) const; void gpx_write_common_extensions(const Waypoint* waypointp, gpx_point_type point_type) const; - void gpx_write_common_description(const Waypoint* waypointp, const QString& oname) const; + void gpx_write_common_description(const Waypoint* waypointp, gpx_point_type point_type, const gpx_wpt_fsdata* fs_gpxwpt) const; void gpx_waypt_pr(const Waypoint* waypointp) const; + void gpx_write_common_core(const Waypoint* waypointp, gpx_point_type point_type) const; void gpx_track_hdr(const route_head* rte); void gpx_track_disp(const Waypoint* waypointp) const; void gpx_track_tlr(const route_head* unused); @@ -261,6 +288,7 @@ class GpxFormat : public Format int next_trkpt_is_new_seg{}; FormatSpecificDataList* fs_ptr{}; + gpx_wpt_fsdata* wpt_fsdata{nullptr}; /* * The file-level information. @@ -409,22 +437,26 @@ class GpxFormat : public Format /* Common to tracks, routes, and waypts */ GPXWPTTYPETAG("ele", tt_wpttype_ele, false), GPXWPTTYPETAG("time", tt_wpttype_time, false), + GPXWPTTYPETAG("magvar", tt_wpttype_magvar, false), GPXWPTTYPETAG("geoidheight", tt_wpttype_geoidheight, false), GPXWPTTYPETAG("name", tt_wpttype_name, false), GPXWPTTYPETAG("cmt", tt_wpttype_cmt, false), GPXWPTTYPETAG("desc", tt_wpttype_desc, false), + GPXWPTTYPETAG("src", tt_wpttype_src, false), GPXWPTTYPETAG("url", tt_wpttype_url, false), /* GPX 1.0 */ GPXWPTTYPETAG("urlname", tt_wpttype_urlname, false), /* GPX 1.0 */ GPXWPTTYPETAG("link", tt_wpttype_link, false), /* GPX 1.1 */ GPXWPTTYPETAG("link/text", tt_wpttype_link_text, false), /* GPX 1.1 */ GPXWPTTYPETAG("link/type", tt_wpttype_link_type, false), /* GPX 1.1 */ GPXWPTTYPETAG("sym", tt_wpttype_sym, false), - GPXWPTTYPETAG("type", tt_wpttype_type, true), + GPXWPTTYPETAG("type", tt_wpttype_type, false), GPXWPTTYPETAG("fix", tt_wpttype_fix, false), GPXWPTTYPETAG("sat", tt_wpttype_sat, false), GPXWPTTYPETAG("hdop", tt_wpttype_hdop, false), GPXWPTTYPETAG("vdop", tt_wpttype_vdop, false), GPXWPTTYPETAG("pdop", tt_wpttype_pdop, false), + GPXWPTTYPETAG("ageofdgpsdata", tt_wpttype_ageofdgpsdata, false), + GPXWPTTYPETAG("dgpsid", tt_wpttype_dgpsid, false), }; QVector gpx_args = { diff --git a/reference/basecamp~gpx.gpx b/reference/basecamp~gpx.gpx index 77234b87f..fe07c4a21 100644 --- a/reference/basecamp~gpx.gpx +++ b/reference/basecamp~gpx.gpx @@ -13,6 +13,7 @@ Hwy 119 Hwy 119 Flag, Blue + user SymbolAndName @@ -25,6 +26,7 @@ Hwy 72 Hwy 72 Flag, Blue + user SymbolAndName diff --git a/reference/wptsequence.gpx b/reference/wptsequence.gpx new file mode 100644 index 000000000..881f958e7 --- /dev/null +++ b/reference/wptsequence.gpx @@ -0,0 +1,76 @@ + + + + + + 289.200 + + 33.333 + 111.1 + trkpt-2011-07-02T17:47:25.000Z + this is the wpt cmt + this is the wpt desc + this is the wpt src + http://www.gpsbabel.org + gpsbabel.org + Campground + T + 3d + 4 + 1.100000 + 2.200000 + 3.300000 + 4.4 + 55 + + + + 289.200 + + 33.333 + 111.1 + trkpt-2011-07-02T17:47:25.000Z + this is the rte cmt + this is the rte desc + this is the rte src + http://www.gpsbabel.org + gpsbabel.org + Campground + T + 3d + 4 + 1.100000 + 2.200000 + 3.300000 + 4.4 + 55 + + + + + + 289.200 + + 12.120000 + 13.818100 + 33.333 + 111.1 + trkpt-2011-07-02T17:47:25.000Z + this is the trk cmt + this is the trk desc + this is the trk src + http://www.gpsbabel.org + gpsbabel.org + Campground + T + 3d + 4 + 1.100000 + 2.200000 + 3.300000 + 4.4 + 55 + + + + diff --git a/testo.d/gpx.test b/testo.d/gpx.test index 80a356086..f37fcf267 100644 --- a/testo.d/gpx.test +++ b/testo.d/gpx.test @@ -61,3 +61,45 @@ compare ${REFERENCE}/gdb-sample-v3-ilinks.gpx ${TMPDIR}/gdb-sample-v3-ilinks.gpx # use declared namespace prefixes in gpx reader gpsbabel -t -i gpx -f ${REFERENCE}/track/garminconnect.gpx -o unicsv,utc=0 -F ${TMPDIR}/garminconnect.csv compare ${REFERENCE}/track/garminconnect.csv ${TMPDIR}/garminconnect.csv + +# order of wpt type elements +gpsbabel -i gpx -f ${REFERENCE}/wptsequence.gpx -o gpx -F ${TMPDIR}/wptsequence.gpx +compare ${REFERENCE}/wptsequence.gpx ${TMPDIR}/wptsequence.gpx + +if [ -z "${VALGRIND}" ]; then + set -e + if command -v xmllint > /dev/null; + then + GPXS=$(find ${REFERENCE} -name \*.gpx) + mkdir -p ${TMPDIR}/validcheck + for f in $GPXS + do + case $f in + # this isn't a gpx file + ${REFERENCE}/track/trackfilter_discard_err.gpx) + ;; + + *) + tmpf=${TMPDIR}/validcheck/$(basename $f) + gpsbabel -i gpx -f $f -o gpx -F $tmpf + xmllint --schema ${BASEPATH}/tools/schema/gpx/master.xsd --noout $tmpf + ;; + esac; + + case $f in + # this isn't a gpx file + ${REFERENCE}/track/trackfilter_discard_err.gpx) + ;; + + *) + tmpf=${TMPDIR}/validcheck/$(basename $f) + gpsbabel -i gpx -f $f -o gpx,garminextensions -F $tmpf + xmllint --schema ${BASEPATH}/tools/schema/gpx/master.xsd --noout $tmpf + ;; + esac; + done + else + echo "Skipping GPX validation phase." + fi + set +e +fi diff --git a/testo.d/kml.test b/testo.d/kml.test index 212e3cbea..f92f3c4d7 100644 --- a/testo.d/kml.test +++ b/testo.d/kml.test @@ -84,7 +84,7 @@ if [ -z "${VALGRIND}" ]; then *) tmpf=${TMPDIR}/validcheck/$(basename $f) gpsbabel -i kml -f $f -o kml -F $tmpf - xmllint --schema ${BASEPATH}/tools/kml22-schema/kml22gx.xsd --noout $tmpf + xmllint --schema ${BASEPATH}/tools/schema/kml/kml22gx.xsd --noout $tmpf esac; done else diff --git a/tools/schema/gpx/fetch b/tools/schema/gpx/fetch new file mode 100755 index 000000000..6c6703d7c --- /dev/null +++ b/tools/schema/gpx/fetch @@ -0,0 +1,14 @@ +#!/bin/bash + +wget -O topografix/gpx10.xsd "http://www.topografix.com/GPX/1/0/gpx.xsd" +wget -O topografix/gpx11.xsd "http://www.topografix.com/GPX/1/1/gpx.xsd" + +wget -P garmin "https://www8.garmin.com/xmlschemas/GpxExtensions/v3/GpxExtensionsv3.xsd" +wget -P garmin "https://www8.garmin.com/xmlschemas/TrackPointExtensionv1.xsd" +wget -P garmin "https://www8.garmin.com/xmlschemas/TrackPointExtensionv2.xsd" +wget -P garmin "https://www8.garmin.com/xmlschemas/TripExtensionsv1.xsd" + +wget -O groundspeak/cache10.xsd "http://www.groundspeak.com/cache/1/0/cache.xsd" +wget -O groundspeak/cache101.xsd "http://www.groundspeak.com/cache/1/0/1/cache.xsd" +wget -O groundspeak/cache11.xsd "http://www.groundspeak.com/cache/1/1/cache.xsd" +wget -O groundspeak/cache12.xsd "http://www.groundspeak.com/cache/1/2/cache.xsd" diff --git a/tools/schema/gpx/garmin/GpxExtensionsv3.xsd b/tools/schema/gpx/garmin/GpxExtensionsv3.xsd new file mode 100644 index 000000000..04d396491 --- /dev/null +++ b/tools/schema/gpx/garmin/GpxExtensionsv3.xsd @@ -0,0 +1,215 @@ + + + + + This schema defines the Garmin extensions to be used with the GPX 1.1 schema. + The root elements defined by this schema are intended to be used as child + elements of the "extensions" elements in the GPX 1.1 schema. The GPX 1.1 + schema is available at http://www.topografix.com/GPX/1/1/gpx.xsd. + + + + + + + + + + + + + + + This type contains data fields available in Garmin GDB waypoints that cannot + be represented in waypoints in GPX 1.1 instances. + + + + + + + + + + + + + + + + This type contains a list of categories to which a waypoint has been assigned. + Note that this list may contain categories which do not exist for a particular + application installation. + + + + + + + + + + + + + + + + + + + + + + + Category provides the ability to specify the type of a + phone number. For example, a phone number can be categorized as + "Home", "Work", "Mobile" e.t.c + + + + + + + + + This type contains data fields available in Garmin GDB routes that cannot + be represented in routes in GPX 1.1 instances. + + + + + + + + + + + This type contains data fields available in Garmin GDB routes that cannot + be represented in routes in GPX 1.1 instances. + + + + + + + + + + + This type contains data fields available in Garmin GDB tracks that cannot + be represented in routes in GPX 1.1 instances. + + + + + + + + + + This type contains data fields available in Garmin GDB track points that cannot + be represented in track points in GPX 1.1 instances. + + + + + + + + + + + This type contains a temperature value measured in degrees Celsius. + + + + + + + This type contains a distance value measured in meters. + + + + + + + This type contains a string that specifies how a waypoint should be + displayed on a map. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The latitude of the point. Decimal degrees, WGS84 datum. + + + + + + + + + + The longitude of the point. Decimal degrees, WGS84 datum. + + + + + + + + + + This type provides the ability to extend any data type that includes it. + + + + + + + diff --git a/tools/schema/gpx/garmin/GpxExtensionsv3.xsd.1 b/tools/schema/gpx/garmin/GpxExtensionsv3.xsd.1 new file mode 100644 index 000000000..04d396491 --- /dev/null +++ b/tools/schema/gpx/garmin/GpxExtensionsv3.xsd.1 @@ -0,0 +1,215 @@ + + + + + This schema defines the Garmin extensions to be used with the GPX 1.1 schema. + The root elements defined by this schema are intended to be used as child + elements of the "extensions" elements in the GPX 1.1 schema. The GPX 1.1 + schema is available at http://www.topografix.com/GPX/1/1/gpx.xsd. + + + + + + + + + + + + + + + This type contains data fields available in Garmin GDB waypoints that cannot + be represented in waypoints in GPX 1.1 instances. + + + + + + + + + + + + + + + + This type contains a list of categories to which a waypoint has been assigned. + Note that this list may contain categories which do not exist for a particular + application installation. + + + + + + + + + + + + + + + + + + + + + + + Category provides the ability to specify the type of a + phone number. For example, a phone number can be categorized as + "Home", "Work", "Mobile" e.t.c + + + + + + + + + This type contains data fields available in Garmin GDB routes that cannot + be represented in routes in GPX 1.1 instances. + + + + + + + + + + + This type contains data fields available in Garmin GDB routes that cannot + be represented in routes in GPX 1.1 instances. + + + + + + + + + + + This type contains data fields available in Garmin GDB tracks that cannot + be represented in routes in GPX 1.1 instances. + + + + + + + + + + This type contains data fields available in Garmin GDB track points that cannot + be represented in track points in GPX 1.1 instances. + + + + + + + + + + + This type contains a temperature value measured in degrees Celsius. + + + + + + + This type contains a distance value measured in meters. + + + + + + + This type contains a string that specifies how a waypoint should be + displayed on a map. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The latitude of the point. Decimal degrees, WGS84 datum. + + + + + + + + + + The longitude of the point. Decimal degrees, WGS84 datum. + + + + + + + + + + This type provides the ability to extend any data type that includes it. + + + + + + + diff --git a/tools/schema/gpx/garmin/TrackPointExtensionv1.xsd b/tools/schema/gpx/garmin/TrackPointExtensionv1.xsd new file mode 100644 index 000000000..78b8649a6 --- /dev/null +++ b/tools/schema/gpx/garmin/TrackPointExtensionv1.xsd @@ -0,0 +1,74 @@ + + + + + This schema defines Garmin extensions to be used with the GPX 1.1 schema. + The root element defined by this schema is intended to be used as a child + element of the "extensions" elements in the trkpt element in the GPX 1.1 schema. + The GPX 1.1 schema is available at http://www.topografix.com/GPX/1/1/gpx.xsd. + This is a replacement for TrackPointExtension in + http://www.garmin.com/xmlschemas/GpxExtensions/v3 + + + + + + + This type contains data fields that cannot + be represented in track points in GPX 1.1 instances. + + + + + + + + + + + + + + This type contains a temperature value measured in degrees Celsius. + + + + + + + This type contains a distance value measured in meters. + + + + + + + This type contains a heart rate measured in beats per minute. + + + + + + + + + This type contains a cadence measured in revolutions per minute. + + + + + + + + + This type provides the ability to extend any data type that includes it. + + + + + + + diff --git a/tools/schema/gpx/garmin/TrackPointExtensionv1.xsd.1 b/tools/schema/gpx/garmin/TrackPointExtensionv1.xsd.1 new file mode 100644 index 000000000..78b8649a6 --- /dev/null +++ b/tools/schema/gpx/garmin/TrackPointExtensionv1.xsd.1 @@ -0,0 +1,74 @@ + + + + + This schema defines Garmin extensions to be used with the GPX 1.1 schema. + The root element defined by this schema is intended to be used as a child + element of the "extensions" elements in the trkpt element in the GPX 1.1 schema. + The GPX 1.1 schema is available at http://www.topografix.com/GPX/1/1/gpx.xsd. + This is a replacement for TrackPointExtension in + http://www.garmin.com/xmlschemas/GpxExtensions/v3 + + + + + + + This type contains data fields that cannot + be represented in track points in GPX 1.1 instances. + + + + + + + + + + + + + + This type contains a temperature value measured in degrees Celsius. + + + + + + + This type contains a distance value measured in meters. + + + + + + + This type contains a heart rate measured in beats per minute. + + + + + + + + + This type contains a cadence measured in revolutions per minute. + + + + + + + + + This type provides the ability to extend any data type that includes it. + + + + + + + diff --git a/tools/schema/gpx/garmin/TrackPointExtensionv2.xsd b/tools/schema/gpx/garmin/TrackPointExtensionv2.xsd new file mode 100644 index 000000000..3417edd3a --- /dev/null +++ b/tools/schema/gpx/garmin/TrackPointExtensionv2.xsd @@ -0,0 +1,94 @@ + + + + + This schema defines Garmin extensions to be used with the GPX 1.1 schema. + The root element defined by this schema is intended to be used as a child + element of the "extensions" elements in the trkpt element in the GPX 1.1 schema. + The GPX 1.1 schema is available at http://www.topografix.com/GPX/1/1/gpx.xsd. + This is a replacement for TrackPointExtension in + http://www.garmin.com/xmlschemas/GpxExtensions/v3 + + + + + + + This type contains data fields that cannot + be represented in track points in GPX 1.1 instances. + + + + + + + + + + + + + + + + + This type contains a temperature value measured in degrees Celsius. + + + + + + + This type contains a distance value measured in meters. + + + + + + + This type contains a heart rate measured in beats per minute. + + + + + + + + + This type contains a cadence measured in revolutions per minute. + + + + + + + + + This type contains a speed measured in meters per second. + + + + + + + This type contains an angle measured in degrees in a clockwise direction from the true north line. + + + + + + + + + + This type provides the ability to extend any data type that includes it. + + + + + + + diff --git a/tools/schema/gpx/garmin/TrackPointExtensionv2.xsd.1 b/tools/schema/gpx/garmin/TrackPointExtensionv2.xsd.1 new file mode 100644 index 000000000..3417edd3a --- /dev/null +++ b/tools/schema/gpx/garmin/TrackPointExtensionv2.xsd.1 @@ -0,0 +1,94 @@ + + + + + This schema defines Garmin extensions to be used with the GPX 1.1 schema. + The root element defined by this schema is intended to be used as a child + element of the "extensions" elements in the trkpt element in the GPX 1.1 schema. + The GPX 1.1 schema is available at http://www.topografix.com/GPX/1/1/gpx.xsd. + This is a replacement for TrackPointExtension in + http://www.garmin.com/xmlschemas/GpxExtensions/v3 + + + + + + + This type contains data fields that cannot + be represented in track points in GPX 1.1 instances. + + + + + + + + + + + + + + + + + This type contains a temperature value measured in degrees Celsius. + + + + + + + This type contains a distance value measured in meters. + + + + + + + This type contains a heart rate measured in beats per minute. + + + + + + + + + This type contains a cadence measured in revolutions per minute. + + + + + + + + + This type contains a speed measured in meters per second. + + + + + + + This type contains an angle measured in degrees in a clockwise direction from the true north line. + + + + + + + + + + This type provides the ability to extend any data type that includes it. + + + + + + + diff --git a/tools/schema/gpx/garmin/TripExtensionsv1.xsd b/tools/schema/gpx/garmin/TripExtensionsv1.xsd new file mode 100644 index 000000000..588d55de3 --- /dev/null +++ b/tools/schema/gpx/garmin/TripExtensionsv1.xsd @@ -0,0 +1,136 @@ + + + + + This schema defines the Garmin route extensions specific to trips to be used + with the GPX 1.1 schema. The root elements defined by this schema are intended to be used as + child elements of the rte element in the GPX 1.1 schema. The GPX 1.1 schema is available at + http://www.topografix.com/GPX/1/1/gpx.xsd. + + + + + + + This type contains data fields intended to be used as child elements of + the rte element in the GPX 1.1 schema + + + + + Suggested transportation mode for this route. If the processor does + not know about the suggested transportation mode, a default will be chosen. Examples + include; Automotive, Motorcycling, Walking, Hiking, Mountaineering, Bicyling, + TourCycling, MountainBiking, ATV, DirtBiking, Truck, RV + + + + + + + + + + + Route via points are announced stops during a route. This type contains + data fields intended to be used as child elements of the rtept element in the GPX 1.1 schema + + + + + + Planned time to leave this route via, not valid for the last via in a + route. Date and time are in Univeral Coordinated Time (UTC), not local time. Conforms to + ISO 8601 specification for date/time representation. + + + + + Time spent at this route via. + + + + + Planned time to arrive at this route via, not valid for the first via + in a route. Date and time are in Univeral Coordinated Time (UTC), not local time. + Conforms to ISO 8601 specification for date/time representation. + + + + + Suggested calculation mode between this route via and the next route + via. If the CalculationMode element is not present or if the processor does not + recognize the suggested calculation mode, the processor may use a calculation mode + specified on a previous via. If none have been previously specified, the processor may + chose a default. Examples include; FasterTime, ShorterDistance, Direct (Off Road), + LessFuel, ScenicRoads + + + + + Suggested elevation mode between this route via and the next route + via. If the ElevationMode element is not present or if the processor does not recognize + the suggested elevation mode, the processor may use an elevation mode specified on a + previous via. If none have been previously specified, the processor may chose a default. + Examples include; Standard, MinimizeAscent + + + + + + + + + + A specific road or trail that the user selected to follow + between this route via and the next route via. If the NamedRoad element is not present + or if the processor does not recognize the suggested named road, the processor may use a + named road specified on a previous via. If none have been previously specified, the + processor may ignore this. + + + + + User friendly name of the road or trail + + + + + ID of the road or trail + + + + + Product and family ID of map product that contains the road or trail + + + + + + + + + + + Route shaping points influence the route path that is calculated, but are + not announced or listed in driving directions. This type contains data fields intended to be + used as child elements of the rtept element in the GPX 1.1 schema + + + + + + + + + This type provides the ability to extend any data type that includes + it. + + + + + + + diff --git a/tools/schema/gpx/garmin/TripExtensionsv1.xsd.1 b/tools/schema/gpx/garmin/TripExtensionsv1.xsd.1 new file mode 100644 index 000000000..588d55de3 --- /dev/null +++ b/tools/schema/gpx/garmin/TripExtensionsv1.xsd.1 @@ -0,0 +1,136 @@ + + + + + This schema defines the Garmin route extensions specific to trips to be used + with the GPX 1.1 schema. The root elements defined by this schema are intended to be used as + child elements of the rte element in the GPX 1.1 schema. The GPX 1.1 schema is available at + http://www.topografix.com/GPX/1/1/gpx.xsd. + + + + + + + This type contains data fields intended to be used as child elements of + the rte element in the GPX 1.1 schema + + + + + Suggested transportation mode for this route. If the processor does + not know about the suggested transportation mode, a default will be chosen. Examples + include; Automotive, Motorcycling, Walking, Hiking, Mountaineering, Bicyling, + TourCycling, MountainBiking, ATV, DirtBiking, Truck, RV + + + + + + + + + + + Route via points are announced stops during a route. This type contains + data fields intended to be used as child elements of the rtept element in the GPX 1.1 schema + + + + + + Planned time to leave this route via, not valid for the last via in a + route. Date and time are in Univeral Coordinated Time (UTC), not local time. Conforms to + ISO 8601 specification for date/time representation. + + + + + Time spent at this route via. + + + + + Planned time to arrive at this route via, not valid for the first via + in a route. Date and time are in Univeral Coordinated Time (UTC), not local time. + Conforms to ISO 8601 specification for date/time representation. + + + + + Suggested calculation mode between this route via and the next route + via. If the CalculationMode element is not present or if the processor does not + recognize the suggested calculation mode, the processor may use a calculation mode + specified on a previous via. If none have been previously specified, the processor may + chose a default. Examples include; FasterTime, ShorterDistance, Direct (Off Road), + LessFuel, ScenicRoads + + + + + Suggested elevation mode between this route via and the next route + via. If the ElevationMode element is not present or if the processor does not recognize + the suggested elevation mode, the processor may use an elevation mode specified on a + previous via. If none have been previously specified, the processor may chose a default. + Examples include; Standard, MinimizeAscent + + + + + + + + + + A specific road or trail that the user selected to follow + between this route via and the next route via. If the NamedRoad element is not present + or if the processor does not recognize the suggested named road, the processor may use a + named road specified on a previous via. If none have been previously specified, the + processor may ignore this. + + + + + User friendly name of the road or trail + + + + + ID of the road or trail + + + + + Product and family ID of map product that contains the road or trail + + + + + + + + + + + Route shaping points influence the route path that is calculated, but are + not announced or listed in driving directions. This type contains data fields intended to be + used as child elements of the rtept element in the GPX 1.1 schema + + + + + + + + + This type provides the ability to extend any data type that includes + it. + + + + + + + diff --git a/tools/schema/gpx/groundspeak/cache10.xsd b/tools/schema/gpx/groundspeak/cache10.xsd new file mode 100644 index 000000000..425dfb9ad --- /dev/null +++ b/tools/schema/gpx/groundspeak/cache10.xsd @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/schema/gpx/groundspeak/cache101.xsd b/tools/schema/gpx/groundspeak/cache101.xsd new file mode 100644 index 000000000..d0873b4a6 --- /dev/null +++ b/tools/schema/gpx/groundspeak/cache101.xsd @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/schema/gpx/groundspeak/cache11.xsd b/tools/schema/gpx/groundspeak/cache11.xsd new file mode 100644 index 000000000..fd83a6d5d --- /dev/null +++ b/tools/schema/gpx/groundspeak/cache11.xsd @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/schema/gpx/groundspeak/cache12.xsd b/tools/schema/gpx/groundspeak/cache12.xsd new file mode 100644 index 000000000..5324fabbd --- /dev/null +++ b/tools/schema/gpx/groundspeak/cache12.xsd @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/schema/gpx/master.xsd b/tools/schema/gpx/master.xsd new file mode 100644 index 000000000..7c767b4a4 --- /dev/null +++ b/tools/schema/gpx/master.xsd @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/tools/schema/gpx/topografix/gpx10.xsd b/tools/schema/gpx/topografix/gpx10.xsd new file mode 100644 index 000000000..a49992ddd --- /dev/null +++ b/tools/schema/gpx/topografix/gpx10.xsd @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/schema/gpx/topografix/gpx11.xsd b/tools/schema/gpx/topografix/gpx11.xsd new file mode 100644 index 000000000..a113a41c3 --- /dev/null +++ b/tools/schema/gpx/topografix/gpx11.xsd @@ -0,0 +1,788 @@ + + + + + + GPX schema version 1.1 - For more information on GPX and this schema, visit http://www.topografix.com/gpx.asp + + GPX uses the following conventions: all coordinates are relative to the WGS84 datum. All measurements are in metric units. + + + + + + + GPX is the root element in the XML file. + + + + + + + + GPX documents contain a metadata header, followed by waypoints, routes, and tracks. You can add your own elements + to the extensions section of the GPX document. + + + + + + + Metadata about the file. + + + + + + + A list of waypoints. + + + + + + + A list of routes. + + + + + + + A list of tracks. + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + + + You must include the version number in your GPX document. + + + + + + + You must include the name or URL of the software that created your GPX document. This allows others to + inform the creator of a GPX instance document that fails to validate. + + + + + + + + + Information about the GPX file, author, and copyright restrictions goes in the metadata section. Providing rich, + meaningful information about your GPX files allows others to search for and use your GPS data. + + + + + + + The name of the GPX file. + + + + + + + A description of the contents of the GPX file. + + + + + + + The person or organization who created the GPX file. + + + + + + + Copyright and license information governing use of the file. + + + + + + + URLs associated with the location described in the file. + + + + + + + The creation date of the file. + + + + + + + Keywords associated with the file. Search engines or databases can use this information to classify the data. + + + + + + + Minimum and maximum coordinates which describe the extent of the coordinates in the file. + + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + + + + wpt represents a waypoint, point of interest, or named feature on a map. + + + + + + + + Elevation (in meters) of the point. + + + + + + + Creation/modification timestamp for element. Date and time in are in Univeral Coordinated Time (UTC), not local time! Conforms to ISO 8601 specification for date/time representation. Fractional seconds are allowed for millisecond timing in tracklogs. + + + + + + + Magnetic variation (in degrees) at the point + + + + + + + Height (in meters) of geoid (mean sea level) above WGS84 earth ellipsoid. As defined in NMEA GGA message. + + + + + + + + + The GPS name of the waypoint. This field will be transferred to and from the GPS. GPX does not place restrictions on the length of this field or the characters contained in it. It is up to the receiving application to validate the field before sending it to the GPS. + + + + + + + GPS waypoint comment. Sent to GPS as comment. + + + + + + + A text description of the element. Holds additional information about the element intended for the user, not the GPS. + + + + + + + Source of data. Included to give user some idea of reliability and accuracy of data. "Garmin eTrex", "USGS quad Boston North", e.g. + + + + + + + Link to additional information about the waypoint. + + + + + + + Text of GPS symbol name. For interchange with other programs, use the exact spelling of the symbol as displayed on the GPS. If the GPS abbreviates words, spell them out. + + + + + + + Type (classification) of the waypoint. + + + + + + + + + Type of GPX fix. + + + + + + + Number of satellites used to calculate the GPX fix. + + + + + + + Horizontal dilution of precision. + + + + + + + Vertical dilution of precision. + + + + + + + Position dilution of precision. + + + + + + + Number of seconds since last DGPS update. + + + + + + + ID of DGPS station used in differential correction. + + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + + + The latitude of the point. This is always in decimal degrees, and always in WGS84 datum. + + + + + + + The longitude of the point. This is always in decimal degrees, and always in WGS84 datum. + + + + + + + + + rte represents route - an ordered list of waypoints representing a series of turn points leading to a destination. + + + + + + + GPS name of route. + + + + + + + GPS comment for route. + + + + + + + Text description of route for user. Not sent to GPS. + + + + + + + Source of data. Included to give user some idea of reliability and accuracy of data. + + + + + + + Links to external information about the route. + + + + + + + GPS route number. + + + + + + + Type (classification) of route. + + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + + A list of route points. + + + + + + + + + + trk represents a track - an ordered list of points describing a path. + + + + + + + GPS name of track. + + + + + + + GPS comment for track. + + + + + + + User description of track. + + + + + + + Source of data. Included to give user some idea of reliability and accuracy of data. + + + + + + + Links to external information about track. + + + + + + + GPS track number. + + + + + + + Type (classification) of track. + + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + + A Track Segment holds a list of Track Points which are logically connected in order. To represent a single GPS track where GPS reception was lost, or the GPS receiver was turned off, start a new Track Segment for each continuous span of track data. + + + + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + + + + A Track Segment holds a list of Track Points which are logically connected in order. To represent a single GPS track where GPS reception was lost, or the GPS receiver was turned off, start a new Track Segment for each continuous span of track data. + + + + + + + A Track Point holds the coordinates, elevation, timestamp, and metadata for a single point in a track. + + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + + + + Information about the copyright holder and any license governing use of this file. By linking to an appropriate license, + you may place your data into the public domain or grant additional usage rights. + + + + + + + Year of copyright. + + + + + + + Link to external file containing license text. + + + + + + + + Copyright holder (TopoSoft, Inc.) + + + + + + + + + A link to an external resource (Web page, digital photo, video clip, etc) with additional information. + + + + + + + Text of hyperlink. + + + + + + + Mime type of content (image/jpeg) + + + + + + + + URL of hyperlink. + + + + + + + + + An email address. Broken into two parts (id and domain) to help prevent email harvesting. + + + + + + id half of email address (billgates2004) + + + + + + + domain half of email address (hotmail.com) + + + + + + + + + A person or organization. + + + + + + + Name of person or organization. + + + + + + + Email address. + + + + + + + Link to Web site or other external information about person. + + + + + + + + + + A geographic point with optional elevation and time. Available for use by other schemas. + + + + + + + The elevation (in meters) of the point. + + + + + + + The time that the point was recorded. + + + + + + + + The latitude of the point. Decimal degrees, WGS84 datum. + + + + + + + The latitude of the point. Decimal degrees, WGS84 datum. + + + + + + + + + An ordered sequence of points. (for polygons or polylines, e.g.) + + + + + + + Ordered list of geographic points. + + + + + + + + + + Two lat/lon pairs defining the extent of an element. + + + + + + The minimum latitude. + + + + + + + The minimum longitude. + + + + + + + The maximum latitude. + + + + + + + The maximum longitude. + + + + + + + + + + The latitude of the point. Decimal degrees, WGS84 datum. + + + + + + + + + + + + The longitude of the point. Decimal degrees, WGS84 datum. + + + + + + + + + + + + Used for bearing, heading, course. Units are decimal degrees, true (not magnetic). + + + + + + + + + + + + Type of GPS fix. none means GPS had no fix. To signify "the fix info is unknown, leave out fixType entirely. pps = military signal used + + + + + + + + + + + + + + + Represents a differential GPS station. + + + + + + + + + diff --git a/tools/kml22-schema/atom-author-link.xsd b/tools/schema/kml/atom-author-link.xsd similarity index 100% rename from tools/kml22-schema/atom-author-link.xsd rename to tools/schema/kml/atom-author-link.xsd diff --git a/tools/kml22-schema/kml22gx.xsd b/tools/schema/kml/kml22gx.xsd similarity index 100% rename from tools/kml22-schema/kml22gx.xsd rename to tools/schema/kml/kml22gx.xsd diff --git a/tools/kml22-schema/ogckml22.xsd b/tools/schema/kml/ogckml22.xsd similarity index 100% rename from tools/kml22-schema/ogckml22.xsd rename to tools/schema/kml/ogckml22.xsd diff --git a/tools/kml22-schema/xAL.xsd b/tools/schema/kml/xAL.xsd similarity index 100% rename from tools/kml22-schema/xAL.xsd rename to tools/schema/kml/xAL.xsd