use of net.osmand.swing.MapPointsLayer in project OsmAnd-tools by osmandapp.
the class AHSupermarketResolver method updateOSMFile.
// this file could be retrieved using xapi
// http://xapi.openstreetmap.org/api/0.6/*[shop=supermarket][bbox=2.5,50,7.8,53.5]
public void updateOSMFile(String pathToOsmFile, String pathToModifiedFile, boolean show) throws IOException, XMLStreamException, JSONException, XmlPullParserException {
OsmBaseStorage storage = new OsmBaseStorage();
final Map<String, EntityId> winkelNumbers = new LinkedHashMap<String, EntityId>();
storage.getFilters().add(new IOsmStorageFilter() {
@Override
public boolean acceptEntityToLoad(OsmBaseStorage storage, EntityId entityId, Entity entity) {
if (entity.getTag("winkelnummer") != null && entity.getTag("name").contains("eijn")) {
winkelNumbers.put(entity.getTag("winkelnummer"), entityId);
return true;
}
// register all nodes in order to operate with ways
return true;
}
});
storage.parseOSM(new FileInputStream(pathToOsmFile), new ConsoleProgressImplementation(2), null, true);
Map<String, Map<String, Object>> supermarkets = getSupermarkets();
DataTileManager<Entity> deleted = new DataTileManager<Entity>();
for (String s : winkelNumbers.keySet()) {
if (!supermarkets.containsKey(s)) {
System.err.println("Shop " + s + " id=" + winkelNumbers.get(s) + " doesn't present on the site.");
EntityId e = winkelNumbers.get(s);
Entity en = storage.getRegisteredEntities().get(e);
deleted.registerObject(en.getLatLon().getLatitude(), en.getLatLon().getLongitude(), en);
}
}
DataTileManager<Entity> notCorrelated = new DataTileManager<Entity>();
DataTileManager<Entity> notShown = new DataTileManager<Entity>();
for (String s : supermarkets.keySet()) {
Map<String, Object> props = supermarkets.get(s);
if (winkelNumbers.get(s) != null) {
EntityId id = winkelNumbers.get(s);
Entity e = storage.getRegisteredEntities().get(id);
EntityInfo info = storage.getRegisteredEntityInfo().get(id);
Map<String, String> newTags = new LinkedHashMap<String, String>();
String p = String.valueOf(props.get("format"));
// IMPORTANT : comment what information should be updated or check
String name = "Albert Heijn";
if (!p.equals("AH")) {
name += " " + p;
}
newTags.put("name", name);
newTags.put("phone", String.valueOf(props.get("phone")));
newTags.put("addr:city", String.valueOf(props.get("city")));
newTags.put("addr:street", String.valueOf(props.get("street")));
newTags.put("addr:housenumber", String.valueOf(props.get("housenr")));
newTags.put("addr:postcode", String.valueOf(props.get("zip")));
JSONArray o = (JSONArray) props.get("hours");
OpeningHoursParser.OpeningHours rules = new OpeningHoursParser.OpeningHours();
BasicOpeningHourRule prev = null;
for (int i = 0; i < 7; i++) {
JSONObject obj = o.getJSONObject(i);
if (!obj.isNull("C") && obj.getBoolean("C")) {
} else {
String opened = String.valueOf(obj.get("F"));
String closed = String.valueOf(obj.get("U"));
int start = Integer.parseInt(opened.substring(0, 2)) * 60 + Integer.parseInt(opened.substring(2));
int end = Integer.parseInt(closed.substring(0, 2)) * 60 + Integer.parseInt(closed.substring(2));
if (prev != null && prev.getStartTime() == start && prev.getEndTime() == end) {
prev.getDays()[i] = true;
} else {
BasicOpeningHourRule rule = new OpeningHoursParser.BasicOpeningHourRule();
rule.getDays()[i] = true;
rule.addTimeRange(start, end);
prev = rule;
rules.addRule(rule);
}
}
}
newTags.put("opening_hours", rules.toString());
// Check distance to info
LatLon real = new LatLon((Double) props.get("lat"), (Double) props.get("lng"));
double dist = MapUtils.getDistance(e.getLatLon(), real);
if (dist > 150) {
// TODO move shop ?
System.err.println("Winkel number = " + s + " is too far from site info - " + dist + " m !!! " + real);
if (dist > 300) {
notCorrelated.registerObject(real.getLatitude(), real.getLongitude(), e);
}
}
boolean changed = false;
for (String k : newTags.keySet()) {
String val = newTags.get(k);
if (!Algorithms.objectEquals(val, e.getTag(k))) {
e.putTag(k, val);
changed = true;
}
}
if (changed) {
info.setAction("modify");
}
} else {
// TODO?
LatLon real = new LatLon((Double) props.get("lat"), (Double) props.get("lng"));
System.err.println("Winkel number = " + s + " is not found in database !!! " + real);
Node n = new Node(real.getLatitude(), real.getLongitude(), -1);
n.putTag("winkelnummer", "REG : " + s);
notShown.registerObject(real.getLatitude(), real.getLongitude(), n);
}
}
OsmStorageWriter writer = new OsmStorageWriter();
writer.saveStorage(new FileOutputStream(pathToModifiedFile), storage, null, true);
if (show) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
final MapPanel panel = new MapPanel(DataExtractionSettings.getSettings().getTilesDirectory());
panel.setFocusable(true);
MapPointsLayer toAdd = panel.getLayer(MapPointsLayer.class);
toAdd.setPoints(notShown);
toAdd.setPointSize(5);
toAdd.setTagToShow("winkelnummer");
MapPointsLayer red = new MapPointsLayer();
red.setPoints(deleted);
red.setColor(Color.red);
red.setPointSize(5);
panel.addLayer(red);
MapPointsLayer blue = new MapPointsLayer();
blue.setPoints(notCorrelated);
blue.setColor(Color.blue);
blue.setPointSize(4);
panel.addLayer(blue);
JFrame frame = new JFrame("Map view");
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
DataExtractionSettings settings = DataExtractionSettings.getSettings();
settings.saveDefaultLocation(panel.getLatitude(), panel.getLongitude());
settings.saveDefaultZoom(panel.getZoom());
System.exit(0);
}
});
Container content = frame.getContentPane();
content.add(panel, BorderLayout.CENTER);
JMenuBar bar = new JMenuBar();
bar.add(MapPanel.getMenuToChooseSource(panel));
frame.setJMenuBar(bar);
frame.setSize(512, 512);
frame.setVisible(true);
}
}
Aggregations