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(); } }