/**************************************************************************
OSMemory library for OSM data processing.
Copyright (C) 2014 Aleś Bułojčyk <alex73mail@gmail.com>
This 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.
This software 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 this program. If not, see <http://www.gnu.org/licenses/>.
**************************************************************************/
package org.alex73.osmemory;
import java.io.File;
import java.util.Arrays;
import com.vividsolutions.jts.geom.Envelope;
/**
* This class reads o5m file and stores all data into MemoryStorage.
*/
public class O5MReader extends BaseReader {
public static void main(String[] aa) throws Exception {
MemoryStorage st = new O5MReader().read(new File("tmp/belarus-updated.o5m"));
st.showStat();
}
public O5MReader() {
super(null);
}
public O5MReader(Envelope cropBox) {
super(cropBox);
}
public O5MReader(MemoryStorage storage, double minLat, double maxLat, double minLon, double maxLon) {
super(storage, new Envelope(minLon, maxLon, minLat, maxLat));
}
public MemoryStorage read(File file) throws Exception {
new O5MDriver(this).read(file);
storage.finishLoading();
return storage;
}
protected void applyTags(O5MDriver driver, OsmBase obj) {
for (int i = 0; i < driver.getObjectTagsCount(); i++) {
obj.tagKeys[i] = storage.getTagsPack().getTagCode(driver.getObjectTagKeyString(i));
obj.tagValues[i] = driver.getObjectTagValueBytes(i);
}
}
/**
* @param timestamp
* The Unit is seconds since Jan 01 1970.
*/
protected void fileTimestamp(long timestamp) {
}
/**
* Add nodes inside specified crop box.
*/
protected void createNode(O5MDriver driver, long id, int lat, int lon, String user) {
if (lat > 900000000 || lat < -900000000) {
throw new RuntimeException("Wrong value for latitude: " + lat);
}
if (lon > 1800000000 || lon < -1800000000) {
throw new RuntimeException("Wrong value for longitude: " + lon);
}
if (!isInsideCropBox(lat, lon)) {
return;
}
if (driver.getObjectTagsCount() > 0) {
short userCode = storage.getUsersPack().getTagCode(user);
OsmNode result = new OsmNode(id, driver.getObjectTagsCount(), lat, lon, userCode);
applyTags(driver, result);
storage.nodes.add(result);
} else {
if (storage.simpleNodeCount >= storage.simpleNodeIds.length) {
// extend
storage.simpleNodeIds = Arrays.copyOf(storage.simpleNodeIds,
storage.simpleNodeIds.length + 1024 * 1024);
storage.simpleNodeLats = Arrays.copyOf(storage.simpleNodeLats,
storage.simpleNodeLats.length + 1024 * 1024);
storage.simpleNodeLons = Arrays.copyOf(storage.simpleNodeLons,
storage.simpleNodeLons.length + 1024 * 1024);
}
int p = storage.simpleNodeCount++;
storage.simpleNodeIds[p] = id;
storage.simpleNodeLats[p] = lat;
storage.simpleNodeLons[p] = lon;
}
}
/**
* Add ways that contains known nodes, i.e. inside specified crop box.
*/
protected void createWay(O5MDriver driver, long id, long[] nodes, String user) {
short userCode = storage.getUsersPack().getTagCode(user);
OsmWay result = new OsmWay(id, driver.getObjectTagsCount(), nodes, userCode);
boolean inside = false;
for (int i = 0; i < nodes.length; i++) {
if (storage.getNodeById(nodes[i]) != null) {
inside = true;
break;
}
}
if (inside) {
applyTags(driver, result);
storage.ways.add(result);
}
}
/**
* Add all relations.
*/
protected void createRelation(O5MDriver driver, long id, long[] memberIds, byte[] memberTypes, String user) {
short userCode = storage.getUsersPack().getTagCode(user);
OsmRelation result = new OsmRelation(id, driver.getObjectTagsCount(), memberIds, memberTypes,
userCode);
for (int i = 0; i < result.memberRoles.length; i++) {
result.memberRoles[i] = storage.getRelationRolesPack().getTagCode(driver.getMemberRoleString(i));
}
applyTags(driver, result);
storage.relations.add(result);
}
}