/**
* This file is part of Relation Analyzer for OSM.
* Copyright (c) 2001 by Adrian Stabiszewski, as@grundid.de
*
* Relation Analyzer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Relation Analyzer 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Relation Analyzer. If not, see <http://www.gnu.org/licenses/>.
*/
package org.osmtools.ra.converter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.osm.schema.Osm;
import org.osm.schema.OsmMember;
import org.osm.schema.OsmNd;
import org.osm.schema.OsmNode;
import org.osm.schema.OsmRelation;
import org.osm.schema.OsmTag;
import org.osm.schema.OsmType;
import org.osm.schema.OsmWay;
import org.osmtools.ra.data.Member;
import org.osmtools.ra.data.Node;
import org.osmtools.ra.data.Relation;
import org.osmtools.ra.data.Way;
import org.springframework.stereotype.Service;
@Service
public class OsmSchemaConverterService {
public List<Relation> convert(Osm osmRoot) {
Map<Long, Node> knownNodes = createNodes(osmRoot);
Map<Long, Way> knownWays = createWays(osmRoot, knownNodes);
return createRelations(osmRoot, knownWays);
}
private List<Relation> createRelations(Osm osmRoot, Map<Long, Way> knownWays) {
List<Relation> relations = new ArrayList<Relation>();
for (OsmRelation osmRelation : osmRoot.getRelation()) {
List<Member> members = createMembers(osmRelation, knownWays);
Map<String, String> tags = createTags(osmRelation);
relations.add(new Relation(osmRelation.getId().longValue(), members, osmRelation.getTimestamp()
.toGregorianCalendar(), osmRelation.getUser(), tags));
}
return relations;
}
private Map<String, String> createTags(OsmRelation osmRelation) {
Map<String, String> tags = new HashMap<String, String>();
for (OsmTag osmTag : osmRelation.getTag()) {
tags.put(osmTag.getK(), osmTag.getV());
}
return tags;
}
private List<Member> createMembers(OsmRelation osmRelation, Map<Long, Way> knownWays) {
List<Member> knownMembers = new ArrayList<Member>();
for (OsmMember osmMember : osmRelation.getMember()) {
if (OsmType.WAY.equals(osmMember.getType()))
knownMembers.add(new Member(knownWays.get(osmMember.getRef().longValue()), osmMember.getRole()));
}
return knownMembers;
}
private Map<Long, Way> createWays(Osm osmRoot, Map<Long, Node> knownNodes) {
Map<Long, Way> ways = new HashMap<Long, Way>(osmRoot.getWay().size());
for (OsmWay way : osmRoot.getWay()) {
ways.put(way.getId().longValue(), createWay(way, knownNodes));
}
return ways;
}
private Way createWay(OsmWay way, Map<Long, Node> knownNodes) {
Way newWay = new Way(way.getId().longValue(), way.getNd().size());
for (OsmNd nd : way.getNd()) {
newWay.addNode(knownNodes.get(nd.getRef().longValue()));
}
for (OsmTag tag : way.getTag()) {
newWay.setTag(tag.getK(), tag.getV());
}
return newWay;
}
private Map<Long, Node> createNodes(Osm osmRoot) {
Map<Long, Node> nodes = new HashMap<Long, Node>(osmRoot.getNode().size());
for (OsmNode node : osmRoot.getNode()) {
nodes.put(node.getId().longValue(), createNode(node));
}
return nodes;
}
private Node createNode(OsmNode node) {
return new Node(node.getId().longValue(), node.getLat(), node.getLon());
}
}