From 94b4a0ce6619037d7e2454f4f39133bca185359f Mon Sep 17 00:00:00 2001 From: philippe lhardy Date: Sun, 1 Nov 2020 12:44:05 +0100 Subject: [PATCH] read osm format longitude and latitude bounds, separate ways and buildings - read longitude and lattude boundaries - separate ways ( open ways ) from buildings ( closed ) - save as .imc and .drawing ( raw format ) [ since .imc seems buggy ) - read uncompressed drawing format --- .../games/maze/gui/Display.java | 56 +++++++++- .../artisanlogiciel/games/minetest/Node.java | 4 +- java/org/artisanlogiciel/osm/OsmReader.java | 89 +++++++++++++-- .../osm/convert/OsmToDrawing.java | 103 +++++++++++++++++- 4 files changed, 237 insertions(+), 15 deletions(-) diff --git a/java/org/artisanlogiciel/games/maze/gui/Display.java b/java/org/artisanlogiciel/games/maze/gui/Display.java index f81980c..e9b81f9 100644 --- a/java/org/artisanlogiciel/games/maze/gui/Display.java +++ b/java/org/artisanlogiciel/games/maze/gui/Display.java @@ -397,6 +397,26 @@ implements StatusListener loadMenu.add(loadImcButton); + Action loadDrawingAction = new AbstractAction() { + public void actionPerformed(ActionEvent evt) { + // + addStatus("load Drawing"); + + String filename = loadName.getText(); + + if ((filename.length() > 0)) { + setMazeName(filename); + loadDrawing(false); + refresh(); + } + + } + }; + JButton loadDrawingButton = new JButton(labels.getString("load" ) + " Drawing"); + loadDrawingButton.addActionListener(loadDrawingAction); + + loadMenu.add(loadDrawingButton); + Action loadOsmAction = new AbstractAction() { public void actionPerformed(ActionEvent evt) { // @@ -701,9 +721,9 @@ implements StatusListener FileInputStream inputStream = null; try { // TODO really use InputStream and not pathname - OsmToDrawing converter = new OsmToDrawing(43.6399000, 7.0058300, 10000,10000); OsmReader reader = new OsmReader(infile.getCanonicalPath()); reader.read(); + OsmToDrawing converter = new OsmToDrawing(reader, 25000,25000); Drawing drawing = converter.getDrawing(reader.getWays()); statusEnable = false; maze.addDrawing(drawing,add); @@ -760,6 +780,40 @@ implements StatusListener } } + private void loadDrawing(boolean add) { + if ( maze != null ) { + new Thread() { + @Override + public void run() { + File infile = new File(params.getSaveDir(), params.getName() + ".drawing"); + FileInputStream inputStream = null; + try { + inputStream = new FileInputStream(infile); + // TODO + // model = new MazePersistRaw().parseInputStream("raw",inputStream); + Drawing drawing = new Drawing(); + drawing.loadLines(new DataInputStream(inputStream)); + statusEnable = false; + maze.addDrawing(drawing,add); + statusEnable = true; + } catch (IOException io) { + io.printStackTrace(System.err); + statusField.setText("[ERROR] Can't load " + infile.getAbsolutePath()); + } finally { + if (inputStream != null) { + // cleanup + try { + inputStream.close(); + } catch (Exception any) { + // don't care really + } + } + } + } + }.start(); + } + } + private JButton addDirection(final JPanel panel, final String direction, String key, Action goAction) { String actionName = "go" + direction; JButton button = new JButton(direction); diff --git a/java/org/artisanlogiciel/games/minetest/Node.java b/java/org/artisanlogiciel/games/minetest/Node.java index 92d6d7f..a5adc2d 100644 --- a/java/org/artisanlogiciel/games/minetest/Node.java +++ b/java/org/artisanlogiciel/games/minetest/Node.java @@ -1,2 +1,4 @@ -package org.artisanlogiciel.games.minetest;public class Node { +package org.artisanlogiciel.games.minetest; + +public class Node { } diff --git a/java/org/artisanlogiciel/osm/OsmReader.java b/java/org/artisanlogiciel/osm/OsmReader.java index 70c761d..910116c 100644 --- a/java/org/artisanlogiciel/osm/OsmReader.java +++ b/java/org/artisanlogiciel/osm/OsmReader.java @@ -18,10 +18,38 @@ public class OsmReader { private HashMap refs; private List ways; + public List getBuildings() { + return buildings; + } + + private List buildings; + + public double getMinlat() { + return minlat; + } + + public double getMinlon() { + return minlon; + } + + public double getMaxlat() { + return maxlat; + } + + public double getMaxlon() { + return maxlon; + } + + double minlat = 0; + double minlon = 0; + double maxlat = 180; + double maxlon = 180; + public OsmReader(String sample) { this.sample = sample; refs = new HashMap<>(); ways = new ArrayList<>(); + buildings = new ArrayList<>(); } public List getWays() { @@ -38,6 +66,25 @@ public class OsmReader { Document doc = builder.parse(new FileInputStream(sample)); Element root = doc.getDocumentElement(); System.out.println(root); + // + NodeList boundList = doc.getElementsByTagName("bounds"); + for (int temp = 0; temp < boundList.getLength(); temp++) { + org.w3c.dom.Node nNode = boundList.item(temp); + if (nNode.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) { + Element e = (Element) nNode; + minlat = Double.valueOf(e.getAttribute("minlat")); + minlon = Double.valueOf(e.getAttribute("minlon")); + maxlat = Double.valueOf(e.getAttribute("maxlat")); + maxlon = Double.valueOf(e.getAttribute("maxlon")); + } + } + + int boundserror = 0; + System.out.println("minlat " + minlat); + System.out.println("maxlat " + maxlat); + System.out.println("minlon " + minlon); + System.out.println("maxlon " + maxlon); + NodeList nList = doc.getElementsByTagName("node"); for (int temp = 0; temp < nList.getLength(); temp++) { org.w3c.dom.Node nNode = nList.item(temp); @@ -46,6 +93,26 @@ public class OsmReader { long id = Long.valueOf(e.getAttribute("id")); double lat = Double.valueOf(e.getAttribute("lat")); double lon = Double.valueOf(e.getAttribute("lon")); + if (lat < minlat) + { + boundserror ++; + System.err.println("lat < minlat " + lat ); + } + else if (lat > maxlat) + { + boundserror ++; + System.err.println("lat > minlat " + lat); + } + if (lon < minlon) + { + boundserror ++; + System.err.println("lon < minlon " + lon); + } + else if (lon > maxlon) + { + boundserror ++; + System.err.println("lon > minlon " + lon); + } Node node = new Node(new NodeRef(id), lat, lon); refs.put(node.getRef(),node); } @@ -75,8 +142,19 @@ public class OsmReader { } } } - Way way = new Way(id, nodeRefList); - ways.add(way); + if ( nodeRefList.size() > 0 ) + { + Way way = new Way(id, nodeRefList); + // closed way ? + if (nodeRefList.get(0).equals(nodeRefList.get(nodeRefList.size() -1))) + { + buildings.add(way); + } + else + { + ways.add(way); + } + } } catch (Exception bad) { @@ -98,12 +176,5 @@ public class OsmReader { System.out.println(refs); System.out.println(ways); } - public static void main(String pArgs[]) - { - String sample = "/home/plhardy/valbonne3D/valbonne_oct_2020.osm"; - OsmReader osmreader = new OsmReader(sample); - osmreader.read(); - osmreader.dump(); - } } diff --git a/java/org/artisanlogiciel/osm/convert/OsmToDrawing.java b/java/org/artisanlogiciel/osm/convert/OsmToDrawing.java index fefbf5b..58110ae 100644 --- a/java/org/artisanlogiciel/osm/convert/OsmToDrawing.java +++ b/java/org/artisanlogiciel/osm/convert/OsmToDrawing.java @@ -4,9 +4,14 @@ import org.artisanlogiciel.graphics.Drawing; import org.artisanlogiciel.graphics.DrawingLine; import org.artisanlogiciel.osm.Node; import org.artisanlogiciel.osm.NodeRef; +import org.artisanlogiciel.osm.OsmReader; import org.artisanlogiciel.osm.Way; import java.awt.*; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; import java.util.List; /** @@ -20,9 +25,28 @@ public class OsmToDrawing { int mulx = 1; int muly = 1; - public OsmToDrawing() - { + double minlat = 0; + double minlon = 0; + double maxlat = 180; + double maxlon = 180; + int boundserror = 0; + + public OsmToDrawing(OsmReader reader, int mulx, int muly) + { + this.refx = reader.getMinlat(); + this.minlat = reader.getMinlat(); + this.refy = reader.getMinlon(); + this.minlon = reader.getMinlon(); + this.maxlat = reader.getMaxlat(); + this.maxlon = reader.getMaxlon(); + this.mulx = mulx; + this.muly = muly; + + System.out.println("minlat " + minlat); + System.out.println("maxlat " + maxlat); + System.out.println("minlon " + minlon); + System.out.println("maxlon " + maxlon); } public OsmToDrawing(int mulx, int muly) { @@ -43,7 +67,29 @@ public class OsmToDrawing { for (NodeRef nr : way.getNdlist()) { Node node = nr.getNode(); - drawingLine.addPoint(new Point((int) ( (node.getLat() - refx)* mulx ) , (int) ( (node.getLon() - refy ) * muly) )); + double lat = node.getLat(); + double lon = node.getLon(); + if (lat < minlat) + { + boundserror ++; + System.err.println("lat < minlat " + lat ); + } + else if (lat > maxlat) + { + boundserror ++; + System.err.println("lat > minlat " + lat); + } + if (lon < minlon) + { + boundserror ++; + System.err.println("lon < minlon " + lon); + } + else if (lon > maxlon) + { + boundserror ++; + System.err.println("lon > minlon " + lon); + } + drawingLine.addPoint(new Point((int) ( (lat - refx)* mulx ) , (int) ( (lon - refy ) * muly) )); } return drawingLine; } @@ -52,8 +98,57 @@ public class OsmToDrawing { { Drawing drawing = new Drawing(); for (Way way : ways) { - drawing.addLine(getDrawingLine(way)); + int currenterrors = boundserror; + DrawingLine line = getDrawingLine(way); + if ( currenterrors == boundserror ) { + drawing.addLine(line); + } + else + { + System.err.println("skipping one line out of bound nodes"); + } } return drawing; } + + public static void main(String pArgs[]) + { + if ( pArgs.length > 0 ) { + String sample = pArgs[0]; + OsmReader osmreader = new OsmReader(sample); + osmreader.read(); + osmreader.dump(); + OsmToDrawing converter = new OsmToDrawing(osmreader, 25000,25000); + Drawing drawing = converter.getDrawing(osmreader.getWays()); + String savename = sample + ".ways"; + saveImc(savename, drawing); + saveDrawing(savename, drawing); + Drawing drawing2 = converter.getDrawing(osmreader.getBuildings()); + savename = sample + ".buildings"; + saveImc(savename, drawing2); + saveDrawing(savename, drawing2); + } + } + + private static void saveDrawing(String sample, Drawing drawing) { + try { + FileOutputStream out = new FileOutputStream(sample + ".drawing"); + drawing.saveLines(new DataOutputStream(out)); + out.flush(); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static void saveImc(String sample, Drawing drawing) { + try { + FileOutputStream out = new FileOutputStream(sample + ".imc"); + drawing.saveLinesKompressed(new DataOutputStream(out)); + out.flush(); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } }