use of net.osmand.osm.io.OsmBaseStorage in project OsmAnd-tools by osmandapp.
the class InitiativeOsmIndexer method main.
/**
* @param args
* @throws IOException
* @throws XmlPullParserException
*/
public static void main(String[] args) throws IOException, XmlPullParserException {
OsmBaseStorage bs = new OsmBaseStorage();
bs.parseOSM(new FileInputStream("/Users/victorshcherb/osmand/temp/map.osm"), IProgress.EMPTY_PROGRESS);
double minlat = Double.POSITIVE_INFINITY;
double minlon = Double.POSITIVE_INFINITY;
double maxlat = Double.NEGATIVE_INFINITY;
double maxlon = Double.NEGATIVE_INFINITY;
for (Entity es : bs.getRegisteredEntities().values()) {
if (es instanceof Node) {
minlon = Math.min(((Node) es).getLongitude(), minlon);
maxlon = Math.max(((Node) es).getLongitude(), maxlon);
minlat = Math.min(((Node) es).getLatitude(), minlat);
maxlat = Math.max(((Node) es).getLatitude(), maxlat);
}
}
Map<String, Frequency> possibleTags = new HashMap<String, Frequency>();
Map<InitiativeTagValue, Frequency> possibleTagValues = new HashMap<InitiativeTagValue, Frequency>();
for (Entity es : bs.getRegisteredEntities().values()) {
if (!es.getTags().isEmpty()) {
Iterator<Entry<String, String>> iterator = es.getTags().entrySet().iterator();
while (iterator.hasNext()) {
Entry<String, String> e = iterator.next();
addValue(possibleTags, e.getKey());
addValue(possibleTagValues, new InitiativeTagValue(e.getKey(), e.getValue()));
}
}
}
System.out.println("[BBOX]");
int startZoom = 0;
int tileX = 0;
int tileY = 0;
boolean equal = true;
while (equal) {
int ty = (int) MapUtils.getTileNumberY(startZoom + 1, minlat);
int my = (int) MapUtils.getTileNumberY(startZoom + 1, maxlat);
int tx = (int) MapUtils.getTileNumberX(startZoom + 1, minlon);
int mx = (int) MapUtils.getTileNumberX(startZoom + 1, maxlon);
equal = ty == my && tx == mx;
if (equal) {
startZoom++;
tileX = tx;
tileY = ty;
}
}
MapUtils.getTileNumberX(startZoom, minlat);
System.out.println("{tile:0 " + ", zoom: " + startZoom + ", tilex: " + tileX + ", tiley: " + tileY + ", zoomsplit: " + ZOOM_SPLIT + ", minlat: " + (float) minlat + ", " + "minlon: " + (float) minlon + ", maxlat: " + (float) maxlat + ", maxlon: " + (float) maxlon + "}");
int tileId = 0;
int splitTileX = tileX << ZOOM_SPLIT;
int splitTileY = tileY << ZOOM_SPLIT;
for (int x = 0; x < MapUtils.getPowZoom(ZOOM_SPLIT); x++) {
for (int y = 0; y < MapUtils.getPowZoom(ZOOM_SPLIT); y++) {
tileId++;
int tilex = (splitTileX + x);
int tiley = (splitTileY + y);
int zoom = (startZoom + ZOOM_SPLIT);
System.out.println("{subtile: " + tileId + ", zoom: " + zoom + ", tilex:" + tilex + ", tiley:" + tiley + ", minlat: " + (float) MapUtils.getLatitudeFromTile(zoom, tiley) + ", minlon: " + (float) MapUtils.getLongitudeFromTile(zoom, tilex) + ", maxlat: " + (float) MapUtils.getLatitudeFromTile(zoom, tiley + 0.99999) + ", maxlon: " + (float) MapUtils.getLongitudeFromTile(zoom, tilex + 0.99999) + "}");
}
}
List<String> sortTags = sortMap(possibleTags);
List<InitiativeTagValue> sortTagValues = sortByKey(possibleTagValues);
System.out.println("\n[TAGS]");
for (String k : sortTags) {
System.out.println("{tag:'" + k + "', freq:'" + possibleTags.get(k).freq + "'," + "subtiles: {1,3,8,9}}");
}
System.out.println("\n\n[TAGSVALUES]");
System.out.println("[[GROUPING_THRESHOLD " + TAG_VARIETY + "]]");
Map<String, TagDictionary> mp = new LinkedHashMap<String, InitiativeOsmIndexer.TagDictionary>();
String tg = null;
for (InitiativeTagValue k : sortTagValues) {
Frequency ti = possibleTagValues.get(k);
if (ti.freq >= TAG_VARIETY) {
System.out.println("{tag:'" + k.tag + "', value:'" + k.value + "', freq:'" + possibleTagValues.get(k).freq + "', " + "subtiles: {1,3,8,14}}");
} else {
if (!mp.containsKey(k.tag)) {
mp.put(k.tag, new TagDictionary(k.tag));
}
mp.get(k.tag).register(k, ti);
}
if (!k.tag.equals(tg)) {
printTextTag(mp, tg);
}
tg = k.tag;
}
printTextTag(mp, tg);
System.out.println("\n\n[TEXTTAGS]");
for (TagDictionary td : mp.values()) {
System.out.println("{texttag:'" + td.tag + "', unique:'" + td.unique + "', freq:'" + td.freq + "', " + "subtiles: {4,15}}");
for (String abbrev : td.values.keySet()) {
Frequency fa = td.values.get(abbrev);
String ab = fa.values.size() == 1 ? fa.values.iterator().next() : abbrev;
System.out.println("{texttagvalue:'" + td.tag + "', " + "index:'" + ab + "', freq:'" + fa.freq + "', " + "unique:'" + fa.uniqueFreq + "', " + "subtiles: {4,18}}");
}
}
}
use of net.osmand.osm.io.OsmBaseStorage 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);
}
}
use of net.osmand.osm.io.OsmBaseStorage in project OsmAnd-tools by osmandapp.
the class MultipolygonFileTest method parse.
private OsmBaseStorage parse(String file) throws IOException, XmlPullParserException {
InputStream is = MultipolygonFileTest.class.getResourceAsStream(file);
OsmBaseStorage st = new OsmBaseStorage();
st.parseOSM(is, IProgress.EMPTY_PROGRESS);
return st;
}
use of net.osmand.osm.io.OsmBaseStorage in project Osmand by osmandapp.
the class OpenstreetmapRemoteUtil method loadNode.
@Override
public Node loadNode(Amenity n) {
if (n.getId() % 2 == 1) {
// that's way id
return null;
}
long nodeId = n.getId() >> 1;
try {
String res = sendRequest(getSiteApi() + "api/0.6/node/" + nodeId, "GET", null, ctx.getString(R.string.loading_poi_obj) + nodeId, // $NON-NLS-1$ //$NON-NLS-2$
false);
if (res != null) {
OsmBaseStorage st = new OsmBaseStorage();
st.setConvertTagsToLC(false);
// $NON-NLS-1$
st.parseOSM(new ByteArrayInputStream(res.getBytes("UTF-8")), null, null, true);
EntityId id = new Entity.EntityId(EntityType.NODE, nodeId);
Node entity = (Node) st.getRegisteredEntities().get(id);
entityInfo = st.getRegisteredEntityInfo().get(id);
entityInfoId = id;
// check whether this is node (because id of node could be the same as relation)
if (entity != null && MapUtils.getDistance(entity.getLatLon(), n.getLocation()) < 50) {
PoiType poiType = n.getType().getPoiTypeByKeyName(n.getSubType());
if (poiType.getOsmValue().equals(entity.getTag(poiType.getOsmTag()))) {
entity.removeTag(poiType.getOsmTag());
entity.putTagNoLC(EditPoiData.POI_TYPE_TAG, poiType.getTranslation());
} else {
// later we could try to determine tags
}
return entity;
}
return null;
}
} catch (Exception e) {
// $NON-NLS-1$
log.error("Loading node failed " + nodeId, e);
ctx.runInUIThread(new Runnable() {
@Override
public void run() {
Toast.makeText(ctx, ctx.getResources().getString(R.string.shared_string_io_error), Toast.LENGTH_LONG).show();
}
});
}
return null;
}
Aggregations