// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea // Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com // Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology // Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/ // GraphTea Project: http://github.com/graphtheorysoftware/GraphTea // Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com // Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology // Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/ package graphtea.extensions.io.specialjson; import graphtea.graph.graph.*; import graphtea.plugins.main.saveload.SaveLoadPluginMethods; import graphtea.plugins.main.saveload.core.GraphIOException; import graphtea.plugins.main.saveload.core.extension.GraphReaderExtension; import graphtea.ui.UIUtils; import graphtea.ui.components.gpropertyeditor.GCellRenderer; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileNotFoundException; import java.util.HashMap; import java.util.Scanner; import java.util.Vector; import static graphtea.platform.Application.blackboard; public class LoadSpecialjson implements GraphReaderExtension { @Override public boolean accepts(File file) { return SaveLoadPluginMethods.getExtension(file).equals(getExtension()); } public String getName() { return "SpecJSON Format"; } public String getExtension() { return "json"; } String between(String s, char c1, char c2) { return s.substring(s.indexOf(c1) + 1, s.lastIndexOf(c2)).trim(); } @Override public GraphModel read(File file) throws GraphIOException { GraphModel g = new GraphModel(false); //2793 Vector<String> regions = new Vector<>(); Vector<String> sttlWithoutCoordinates = new Vector<>(); HashMap<String,Integer> labelVertex = new HashMap<>(); HashMap<String,Vector<Integer>> regionVertices = new HashMap<>(); HashMap<Integer, String> verticesRegion = new HashMap<>(); try { int i = 0; final double QUARTERPI = Math.PI / 4.0; Scanner sc = new Scanner(file); FastRenderer.defaultVertexRadius = 12; RenderTable rt = new RenderTable(); Vector<String> titles = new Vector<>(); titles.add("Settlements"); titles.add("Vertex"); titles.add("processed"); rt.setTitles(titles); g.addVertex(new Vertex()); while (sc.hasNext()) { String line = sc.nextLine(); if (line.contains("region")) { i++; String region = extract_value_from_line(line); if (region.contains(",")) region = region.substring(0, region.indexOf(",")); String str_lat = extract_value_from_line(sc.nextLine()); String str_lng = extract_value_from_line(sc.nextLine()); sc.nextLine(); double lat = 0, lng = 0; line = sc.nextLine(); String id = extract_value_from_line(line); if (!str_lat.contains("nul")) { lat = Double.parseDouble(str_lat); lng = Double.parseDouble(str_lng); } else { sttlWithoutCoordinates.add(id); Vector<Object> vs = new Vector<>(); vs.add(id); vs.add((double) i); vs.add("No"); rt.add(vs); } labelVertex.put(id, i); Vertex v = new Vertex(); v.setLabel(id); v.setLocation(convertLatLonToXY(lat, lng)); g.addVertex(v); if (regionVertices.keySet().contains(region)) { regionVertices.get(region).add(i); } else { regionVertices.put(region, new Vector<>()); regionVertices.get(region).add(i); } verticesRegion.put(i, region); if (!regions.contains(region)) regions.add(region); g.getVertex(i).setColor(regions.indexOf(region) + 2); } } Scanner sc2 = new Scanner(file); while (sc2.hasNext()) { String line = sc2.nextLine(); if (line.contains("source")) { int src = Integer.parseInt(between(line, ':', ',')); line = sc2.nextLine(); int len = -1; if (!line.contains("nul")) len = (int) Math.floor(Double.parseDouble(between(line, ':', ','))); line = sc2.nextLine(); int tgt = Integer.parseInt(line.substring(line.indexOf(":") + 1).trim()); if (len == -1) continue; if (sttlWithoutCoordinates.contains(g.getVertex(src).getLabel()) || sttlWithoutCoordinates.contains(g.getVertex(tgt).getLabel())) { // Edge e = new Edge(g.getVertex(src), g.getVertex(tgt)); // e.setWeight(len); // g.addEdge(e); } } } JDialog jd = new JDialog(UIUtils.getGFrame(blackboard)); jd.setVisible(true); jd.setTitle("Settlements without coordinates"); jd.setLayout(new BorderLayout(3, 3)); //jd.add(new JLabel(mr.getDescription()), BorderLayout.NORTH); Component rendererComponent = GCellRenderer.getRendererFor(rt); rendererComponent.setEnabled(true); jd.add(rendererComponent, BorderLayout.CENTER); Button bt = new Button("Show settlements without coordinates"); bt.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { int i = 0; for(Vertex v : g) { if(sttlWithoutCoordinates.contains(v.getLabel())) { // v.setColor(3); //v.setLocation(new GPoint(200,200 + i*20)); i++; } else { v.setLocation(new GPoint(100,100)); v.setColor(0); } } } }); bt.setSize(new Dimension(200,50)); jd.add(bt, BorderLayout.SOUTH); jd.pack(); jd.setVisible(true); } catch (FileNotFoundException e) { e.printStackTrace(); } // for(String s : sttlWithoutCoordinates) { GPoint gp = new GPoint(0, 0); int num = 0; for (int ver : regionVertices.get(verticesRegion.get(g.getVertex(labelVertex.get(s)).getId()))) { if (g.getVertex(ver).getLocation().getX() == 100) continue; num++; gp.add(g.getVertex(ver).getLocation()); } gp.multiply(1.0 / num); // System.out.println(s + " " + gp); g.getVertex(labelVertex.get(s)).setLocation(gp); // g.getVertex(labelVertex.get(s)).setColor(50); } // // for(String s : sttlWithoutCoordinates) { // Vector<GPoint> vs = new Vector<>(); // for(Vertex n : g.getNeighbors(g.getVertex(labelVertex.get(s)))) { // if(!sttlWithoutCoordinates.contains(n.getLabel())) { // vs.add(n.getLocation()); // } // } // if(vs.size()>2) { // vs.get(0).add(vs.get(1)); // vs.get(0).multiply(0.5); // g.getVertex(labelVertex.get(s)).setLocation(vs.get(0)); // } // } g.removeVertex(g.getVertex(0)); g.setDrawVertexLabels(false); return g; } GPoint convertLatLonToXY(double lat, double lon) { double mapWidth = 2000; double mapHeight = 1000; // get x value double x = (lon + 180) * (mapWidth / 360); // convert from degrees to radians double latRad = lat * Math.PI / 180; // get y value double mercN = Math.log(Math.tan((Math.PI / 4) + (latRad / 2))); double y = (mapHeight / 2) - (mapWidth * mercN / (2 * Math.PI)); return new GPoint(x, y); } String extract_value_from_line(String line) { if(line.charAt(line.length()-1) == ',') line = line.substring(0,line.length()-1); line = line.substring(line.indexOf(":")+1).trim(); line = line.substring(1,line.length()-1).trim(); return line; } public String getDescription() { return "Special JSON File Format"; } }