Search in sources :

Example 11 with OsmBaseStorage

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}}");
        }
    }
}
Also used : Entity(net.osmand.osm.edit.Entity) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Node(net.osmand.osm.edit.Node) FileInputStream(java.io.FileInputStream) LinkedHashMap(java.util.LinkedHashMap) Entry(java.util.Map.Entry) OsmBaseStorage(net.osmand.osm.io.OsmBaseStorage)

Example 12 with OsmBaseStorage

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);
    }
}
Also used : OsmStorageWriter(net.osmand.osm.io.OsmStorageWriter) Entity(net.osmand.osm.edit.Entity) BasicOpeningHourRule(net.osmand.util.OpeningHoursParser.BasicOpeningHourRule) MapPanel(net.osmand.swing.MapPanel) Node(net.osmand.osm.edit.Node) WindowAdapter(java.awt.event.WindowAdapter) LinkedHashMap(java.util.LinkedHashMap) Container(java.awt.Container) DataTileManager(net.osmand.data.DataTileManager) JFrame(javax.swing.JFrame) IOsmStorageFilter(net.osmand.osm.io.IOsmStorageFilter) JSONArray(org.json.JSONArray) DataExtractionSettings(net.osmand.swing.DataExtractionSettings) ConsoleProgressImplementation(net.osmand.impl.ConsoleProgressImplementation) OpeningHoursParser(net.osmand.util.OpeningHoursParser) FileInputStream(java.io.FileInputStream) JSONException(org.json.JSONException) XMLStreamException(javax.xml.stream.XMLStreamException) IOException(java.io.IOException) XmlPullParserException(org.xmlpull.v1.XmlPullParserException) EntityId(net.osmand.osm.edit.Entity.EntityId) LatLon(net.osmand.data.LatLon) MapPointsLayer(net.osmand.swing.MapPointsLayer) JSONObject(org.json.JSONObject) OsmBaseStorage(net.osmand.osm.io.OsmBaseStorage) EntityInfo(net.osmand.osm.edit.EntityInfo) FileOutputStream(java.io.FileOutputStream) WindowEvent(java.awt.event.WindowEvent) JSONObject(org.json.JSONObject) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map) JMenuBar(javax.swing.JMenuBar)

Example 13 with OsmBaseStorage

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;
}
Also used : InputStream(java.io.InputStream) OsmBaseStorage(net.osmand.osm.io.OsmBaseStorage)

Example 14 with OsmBaseStorage

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;
}
Also used : EntityId(net.osmand.osm.edit.Entity.EntityId) ByteArrayInputStream(java.io.ByteArrayInputStream) OsmBaseStorage(net.osmand.osm.io.OsmBaseStorage) Node(net.osmand.osm.edit.Node) PoiType(net.osmand.osm.PoiType) MalformedURLException(java.net.MalformedURLException) IOException(java.io.IOException) XmlPullParserException(org.xmlpull.v1.XmlPullParserException)

Aggregations

OsmBaseStorage (net.osmand.osm.io.OsmBaseStorage)14 FileInputStream (java.io.FileInputStream)8 Entity (net.osmand.osm.edit.Entity)7 EntityId (net.osmand.osm.edit.Entity.EntityId)7 FileOutputStream (java.io.FileOutputStream)6 Node (net.osmand.osm.edit.Node)6 OsmStorageWriter (net.osmand.osm.io.OsmStorageWriter)6 InputStream (java.io.InputStream)5 HashMap (java.util.HashMap)5 LinkedHashMap (java.util.LinkedHashMap)5 ConsoleProgressImplementation (net.osmand.impl.ConsoleProgressImplementation)5 Way (net.osmand.osm.edit.Way)5 CBZip2InputStream (org.apache.tools.bzip2.CBZip2InputStream)4 BufferedInputStream (java.io.BufferedInputStream)3 IOException (java.io.IOException)3 GZIPInputStream (java.util.zip.GZIPInputStream)3 LatLon (net.osmand.data.LatLon)3 XmlPullParserException (org.xmlpull.v1.XmlPullParserException)3 TLongObjectHashMap (gnu.trove.map.hash.TLongObjectHashMap)2 ByteArrayInputStream (java.io.ByteArrayInputStream)2