All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.h2gis.drivers.gpx.model.AbstractGpxParserTrk Maven / Gradle / Ivy

There is a newer version: 1.2.4
Show newest version
/**
 * H2GIS is a library that brings spatial support to the H2 Database Engine
 * .
 *
 * H2GIS is distributed under GPL 3 license. It is produced by CNRS
 * .
 *
 * H2GIS is free software: you can redistribute it and/or modify it under the
 * terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 *
 * H2GIS 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * H2GIS. If not, see .
 *
 * For more information, please consult: 
 * or contact directly: info_at_h2gis.org
 */
package org.h2gis.drivers.gpx.model;

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.MultiLineString;
import com.vividsolutions.jts.geom.Point;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

/**
 * Abstract class of the parsers dedicated to tracks. A specific parser for
 * version 1.0 and version 1.1 will extend this class.
 *
 * @author Erwan Bocher and Antonin Piasco
 */
public abstract class AbstractGpxParserTrk extends AbstractGpxParser {

// Indicates if we are in a point or not
    private boolean point;
// Indicates if we are in a segment or not
    private boolean segment;
// Reference to the default contentHandler of the class GpxParserDefault
    private AbstractGpxParserDefault parent;
// A list which will contain the coordinates of the track segment
    private List trksegList;
// A list which will contain the track segments
    private List trkList;
    //The track segment id
    private int trksegID = 1;
    //The track point id
    private int trkptID = 1;

    /**
     * Create a new specific parser. It has in memory the default parser, the
     * contentBuffer, the elementNames, the currentLine and the trkID.
     *
     * @param reader The XMLReader used in the default class
     * @param parent The parser used in the default class
     */
    public void initialise(XMLReader reader, AbstractGpxParserDefault parent) {
        setReader(reader);
        setParent(parent);
        setContentBuffer(parent.getContentBuffer());
        setTrkPreparedStmt(parent.getTrkPreparedStmt());
        setTrkSegmentsPreparedStmt(parent.getTrkSegmentsPreparedStmt());
        setTrkPointsPreparedStmt(parent.getTrkPointsPreparedStmt());
        setElementNames(parent.getElementNames());
        setCurrentLine(parent.getCurrentLine());
        setTrksegList(new ArrayList());
        setTrkList(new ArrayList());
    }

    /**
     * Fires whenever an XML start markup is encountered. It creates a new
     * trackSegment when a  markup is encountered. It creates a new
     * trackPoint when a  markup is encountered. It saves informations
     * about  in currentPoint or currentLine.
     *
     * @param uri URI of the local element
     * @param localName Name of the local element (without prefix)
     * @param qName qName of the local element (with prefix)
     * @param attributes Attributes of the local element (contained in the
     * markup)
     * @throws SAXException Any SAX exception, possibly wrapping another
     * exception
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if (localName.equalsIgnoreCase(GPXTags.TRKSEG)) {
            segment = true;
            GPXLine trkSegment = new GPXLine(GpxMetadata.TRKSEGFIELDCOUNT);
            trkSegment.setValue(GpxMetadata.LINEID, trksegID++);
            trkSegment.setValue(GpxMetadata.TRKSEG_TRKID, getCurrentLine().getValues()[GpxMetadata.LINEID]);
            setCurrentSegment(trkSegment);
            trksegList.clear();
        } else if (localName.equalsIgnoreCase(GPXTags.TRKPT)) {
            point = true;
            GPXPoint trackPoint = new GPXPoint(GpxMetadata.TRKPTFIELDCOUNT);
            Coordinate coordinate = GPXCoordinate.createCoordinate(attributes);
            Point geom = getGeometryFactory().createPoint(coordinate);
            geom.setSRID(4326);
            trackPoint.setValue(GpxMetadata.THE_GEOM, geom);
            trackPoint.setValue(GpxMetadata.PTLAT, coordinate.y);
            trackPoint.setValue(GpxMetadata.PTLON, coordinate.x);
            trackPoint.setValue(GpxMetadata.PTELE, coordinate.z);
            trackPoint.setValue(GpxMetadata.PTID, trkptID++);
            trackPoint.setValue(GpxMetadata.TRKPT_TRKSEGID, trksegID);
            trksegList.add(coordinate);
            setCurrentPoint(trackPoint);
        }
        // Clear content buffer
        getContentBuffer().delete(0, getContentBuffer().length());
        // Store name of current element in stack
        getElementNames().push(qName);
    }

    /**
     * Fires whenever an XML end markup is encountered. It catches attributes of
     * trackPoints, trackSegments or routes and saves them in corresponding
     * values[].
     *
     * @param uri URI of the local element
     * @param localName Name of the local element (without prefix)
     * @param qName qName of the local element (with prefix)
     * @throws SAXException Any SAX exception, possibly wrapping another
     * exception
     */
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        // currentElement represents the last string encountered in the document
        setCurrentElement(getElementNames().pop());
        if (getCurrentElement().equalsIgnoreCase(GPXTags.TRK)) {
            //parent.setTrksegID(getTrksegID());
            //parent.setTrkptID(getTrkptID());
            // Set the track geometry.
            MultiLineString geometry = getGeometryFactory().createMultiLineString(trkList.toArray(new LineString[trkList.size()]));
            geometry.setSRID(4326);
            getCurrentLine().setGeometry(geometry);
            // if  markup is found, the currentLine is added in the table rtedbd and the default contentHandler is setted.
            try {
                PreparedStatement pStm = getTrkPreparedStmt();
                int i = 1;
                Object[] values = getCurrentLine().getValues();
                for (Object object : values) {
                    pStm.setObject(i, object);
                    i++;
                }
                pStm.execute();
            } catch (SQLException ex) {
                throw new SAXException("Cannot import the track line ", ex);
            }
            getReader().setContentHandler(parent);

        } else if (getCurrentElement().compareToIgnoreCase("trkseg") == 0) {
            Coordinate[] trksegArray = trksegList.toArray(new Coordinate[trksegList.size()]);
            // If there are more than one trackpoint, we can set a geometry to the track segment
            if (trksegList.size() > 1) {
                LineString geometry = getGeometryFactory().createLineString(trksegArray);
                geometry.setSRID(4326);
                getCurrentSegment().setGeometry(geometry);
                trkList.add(geometry);
            }
            // if  markup is found, the currentSegment is added in the table trksegdbd.
            try {
                PreparedStatement pStm = getTrkSegmentsPreparedStmt();
                int i = 1;
                Object[] values = getCurrentSegment().getValues();
                for (Object object : values) {
                    pStm.setObject(i, object);
                    i++;
                }
                pStm.execute();
            } catch (SQLException ex) {
                throw new SAXException("Cannot import the track segment ", ex);
            }

        } else if (getCurrentElement().equalsIgnoreCase(GPXTags.TRKPT)) {
            // if  markup is found, the currentPoint is added in the table trkptdbd.
            point = false;
            try {
                PreparedStatement pStm = getTrkPointsPreparedStmt();
                int i = 1;
                Object[] values = getCurrentPoint().getValues();
                for (Object object : values) {
                    pStm.setObject(i, object);
                    i++;
                }
                pStm.execute();
            } catch (SQLException ex) {
                throw new SAXException("Cannot import the track waypoints.", ex);
            }
        } else if (point) {
            getCurrentPoint().setAttribute(getCurrentElement(), getContentBuffer());
        } else if (segment) {
            getCurrentSegment().setExtensions();
        } else {
            getCurrentLine().setAttribute(getCurrentElement(), getContentBuffer());
        }
    }

    /**
     * *****************************
     ***** GETTERS AND SETTERS ***** *****************************
     */
    /**
     * Set the parent of this specific parser.
     *
     * @param parent
     */
    public void setParent(AbstractGpxParserDefault parent) {
        this.parent = parent;
    }

    /**
     * Indicates if we are in a point.
     *
     * @return true if we are in a point, false else
     */
    public boolean isPoint() {
        return point;
    }

    /**
     * Set the list corresponding to the segments' list of coordinates of the
     * actual track.
     *
     * @param trkList
     */
    public void setTrkList(List trkList) {
        this.trkList = trkList;
    }

    /**
     * Set the list corresponding to the points' coordinates of the actual track
     * segment.
     *
     * @param trksegList
     */
    public void setTrksegList(List trksegList) {
        this.trksegList = trksegList;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy