com.graphhopper.reader.osm.OSMXMLHelper Maven / Gradle / Ivy
/*
* Licensed to GraphHopper GmbH under one or more contributor
* license agreements. See the NOTICE file distributed with this work for
* additional information regarding copyright ownership.
*
* GraphHopper GmbH licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.graphhopper.reader.osm;
import com.graphhopper.reader.ReaderElement;
import com.graphhopper.reader.ReaderNode;
import com.graphhopper.reader.ReaderRelation;
import com.graphhopper.reader.ReaderRelation.Member;
import com.graphhopper.reader.ReaderWay;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.util.List;
/**
* @author Peter Karich
*/
public class OSMXMLHelper {
private static final String TYPE_DECODE = "nwr";
public static ReaderNode createNode(long id, XMLStreamReader parser) throws XMLStreamException {
ReaderNode node = new ReaderNode(id,
Double.parseDouble(parser.getAttributeValue(null, "lat")),
Double.parseDouble(parser.getAttributeValue(null, "lon")));
parser.nextTag();
readTags(node, parser);
return node;
}
public static ReaderWay createWay(long id, XMLStreamReader parser) throws XMLStreamException {
ReaderWay way = new ReaderWay(id);
parser.nextTag();
readNodes(way, parser);
readTags(way, parser);
return way;
}
private static void readNodes(ReaderWay way, XMLStreamReader parser) throws XMLStreamException {
int event = parser.getEventType();
while (event != XMLStreamConstants.END_DOCUMENT && parser.getLocalName().equals("nd")) {
if (event == XMLStreamConstants.START_ELEMENT) {
// read node reference
String ref = parser.getAttributeValue(null, "ref");
way.getNodes().add(Long.parseLong(ref));
}
event = parser.nextTag();
}
}
private static void readTags(ReaderElement re, XMLStreamReader parser) throws XMLStreamException {
int event = parser.getEventType();
while (event != XMLStreamConstants.END_DOCUMENT && parser.getLocalName().equals("tag")) {
if (event == XMLStreamConstants.START_ELEMENT) {
// read tag
String key = parser.getAttributeValue(null, "k");
String value = parser.getAttributeValue(null, "v");
// ignore tags with empty values
if (value != null && value.length() > 0)
re.setTag(key, value);
}
event = parser.nextTag();
}
}
public static ReaderRelation createRelation(long id, XMLStreamReader parser) throws XMLStreamException {
ReaderRelation rel = new ReaderRelation(id);
parser.nextTag();
readMembers(rel, parser);
readTags(rel, parser);
return rel;
}
private static void readMembers(ReaderRelation rel, XMLStreamReader parser) throws XMLStreamException {
int event = parser.getEventType();
while (event != XMLStreamConstants.END_DOCUMENT && parser.getLocalName().equalsIgnoreCase("member")) {
if (event == XMLStreamConstants.START_ELEMENT) {
// read member
rel.add(createMember(parser));
}
event = parser.nextTag();
}
}
public static Member createMember(XMLStreamReader parser) {
String typeName = parser.getAttributeValue(null, "type");
int type = TYPE_DECODE.indexOf(typeName.charAt(0));
long ref = Long.parseLong(parser.getAttributeValue(null, "ref"));
String role = parser.getAttributeValue(null, "role");
return new ReaderRelation.Member(type, ref, role);
}
}