package se.kodapan.osm.sweden.wiki;
import com.vividsolutions.jts.geom.*;
import com.vividsolutions.jts.geom.impl.CoordinateArraySequence;
import se.kodapan.osm.domain.Node;
import se.kodapan.osm.domain.Way;
import se.kodapan.osm.domain.root.Root;
import se.kodapan.osm.parser.xml.instantiated.InstantiatedOsmXmlParser;
import se.kodapan.osm.services.overpass.Overpass;
import se.kodapan.osm.services.overpass.OverpassUtils;
import se.kodapan.osm.xml.OsmXmlWriter;
import java.io.*;
/**
* @author kalle
* @since 2013-11-11 09:45
*/
public class ParkingRobot {
private static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ParkingRobot.class);
public static void main(String[] args) throws Exception {
GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(PrecisionModel.FLOATING));
String userAgent = "Project OSM-Sweden robot, find nodes tagged amenity=parking that are surrounded by ways that are tagged amenity=parking";
Overpass overpass = new Overpass();
overpass.setUserAgent(userAgent);
overpass.setServerURL("http://overpass-sweden.osm.kodapan.se/api/interpreter");
overpass.open();
Root badRoot = new Root();
InstantiatedOsmXmlParser parser = new InstantiatedOsmXmlParser();
Root nodesRoot = new Root();
parser.setRoot(nodesRoot);
parser.parse(new StringReader(
overpass.execute("<osm-script>\n" +
" <query type=\"node\">\n" +
" <has-kv k=\"amenity\" v=\"parking\" />\n" +
" </query>\n" +
" <print mode=\"meta\"/>\n" +
"</osm-script>")));
Root waysRoot = new Root();
parser.setRoot(waysRoot);
parser.parse(new StringReader(
overpass.execute("<osm-script>\n" +
" <union>\n" +
" <query type=\"way\">\n" +
" <has-kv k=\"amenity\" v=\"parking\" />\n" +
" </query>\n" +
" <recurse type=\"way-node\"/>\n" +
" </union>\n" +
" <print mode=\"meta\"/>\n" +
"</osm-script>")));
log.info("Processing " + waysRoot.getWays().size() + " ways...");
for (Way way : waysRoot.getWays().values()) {
log.debug("Procssing way with identity " + way.getId());
Node firstNode = way.getNodes().get(0);
Node lastNode = way.getNodes().get(way.getNodes().size() - 1);
if (firstNode.getLatitude() == lastNode.getLatitude()
&& firstNode.getLongitude() == lastNode.getLongitude()) {
Coordinate[] coordinates = new Coordinate[way.getNodes().size()];
for (int i = 0; i < way.getNodes().size(); i++) {
Node node = way.getNodes().get(i);
Coordinate coordinate = new Coordinate(node.getX(), node.getY());
coordinates[i] = coordinate;
}
CoordinateSequence points = new CoordinateArraySequence(coordinates);
LinearRing shell = new LinearRing(points, geometryFactory);
Polygon polygon = new Polygon(shell, null, geometryFactory);
boolean addWay = false;
for (Node node : nodesRoot.getNodes().values()) {
Coordinate coordinate = new Coordinate(node.getX(), node.getY());
Point point = new Point(new CoordinateArraySequence(new Coordinate[]{coordinate}), geometryFactory);
if (polygon.contains(point)) {
addWay = true;
badRoot.add(node);
}
}
if (addWay) {
badRoot.add(way);
for (Node node : way.getNodes()) {
badRoot.add(node);
}
}
} else {
System.currentTimeMillis();
}
}
// Root minuteRoot = new Root();
// Overpass minuteOverpass = new Overpass();
// minuteOverpass.setServerURL("http://overpass.osm.rambler.ru/cgi/interpreter");
// minuteOverpass.setUserAgent(userAgent);
// minuteOverpass.open();
//
// parser.setRoot(minuteRoot);
//
// OverpassUtils overpassUtils = new OverpassUtils(minuteOverpass);
//
// for (Way way : badRoot.getWays().values()) {
// overpassUtils.loadWay(parser, way.getId());
// }
// for (Node node : badRoot.getNodes().values()) {
// overpassUtils.loadNode(parser, node.getId());
// }
Writer xml = new OutputStreamWriter(new FileOutputStream(new File("/tmp/parking.osm.xml")), "UTF8");
OsmXmlWriter osmXmlWriter = new OsmXmlWriter(xml);
osmXmlWriter.write(badRoot);
osmXmlWriter.close();
System.currentTimeMillis();
}
}