Example #1
0
/* Parses the action="foo" tags in JOSM change files. Obvisouly not useful from osmChange files */
static actions_t ParseAction(char **token, int tokens, struct osmdata_t *osmdata)
{
    if( osmdata->filetype == FILETYPE_OSMCHANGE || osmdata->filetype == FILETYPE_PLANETDIFF )
        return osmdata->action;
    actions_t new_action = ACTION_NONE;
    char *action = extractAttribute(token, tokens, "action");
    if( action == NULL )
        new_action = ACTION_CREATE;
    else if( strcmp((char *)action, "modify") == 0 )
        new_action = ACTION_MODIFY;
    else if( strcmp((char *)action, "delete") == 0 )
        new_action = ACTION_DELETE;
    else
    {
        fprintf( stderr, "Unknown value for action: %s\n", (char*)action );
        exit_nicely();
    }
    return new_action;
}
Example #2
0
static void StartElement(char *name, char *line, struct osmdata_t *osmdata)
{
    char *xid, *xlat, *xlon, *xk, *xv, *xrole, *xtype;
    char *token[255];
    int tokens = 0;
    int quote = 0;
    char *i;

    if (osmdata->filetype == FILETYPE_NONE)
    {
        if (!strcmp(name, "?xml")) return;
        if (!strcmp(name, "osm"))
        {
            osmdata->filetype = FILETYPE_OSM;
            osmdata->action = ACTION_CREATE;
        }
        else if (!strcmp(name, "osmChange"))
        {
            osmdata->filetype = FILETYPE_OSMCHANGE;
            osmdata->action = ACTION_NONE;
        }
        else if (!strcmp(name, "planetdiff"))
        {
            osmdata->filetype = FILETYPE_PLANETDIFF;
            osmdata->action = ACTION_NONE;
        }
        else
        {
            fprintf( stderr, "Unknown XML document type: %s\n", name );
            exit_nicely();
        }
        return;
    }

    tokens=1;
    token[0] = line;
    for (i=line; *i; i++)
    {
        if (quote)
        {
            if (*i == '"') 
            {
                quote = 0;
            }
        }
        else
        {
            if (*i == '"')
            {
                quote = 1;
            }
            else if (isspace(*i))
            {
                *i = 0;
                token[tokens++] = i + 1;
            }
        }
    }

    if (!strcmp(name, "node")) {
        xid  = extractAttribute(token, tokens, "id");
        xlon = extractAttribute(token, tokens, "lon");
        xlat = extractAttribute(token, tokens, "lat");
        assert(xid); assert(xlon); assert(xlat);

        osmdata->osm_id  = strtoosmid((char *)xid, NULL, 10);
        osmdata->node_lon = strtod((char *)xlon, NULL);
        osmdata->node_lat = strtod((char *)xlat, NULL);
        osmdata->action = ParseAction(token, tokens, osmdata);

        if (osmdata->osm_id > osmdata->max_node)
            osmdata->max_node = osmdata->osm_id;

        if (osmdata->count_node == 0) {
            time(&osmdata->start_node);
        }
        
        osmdata->count_node++;
        if (osmdata->count_node%10000 == 0)
            printStatus(osmdata);

    } else if (!strcmp(name, "tag")) {
        xk = extractAttribute(token, tokens, "k");
        assert(xk);

        /* 'created_by' and 'source' are common and not interesting to mapnik renderer */
        if (strcmp((char *)xk, "created_by") && strcmp((char *)xk, "source")) {
            char *p;
            xv = extractAttribute(token, tokens, "v");
            assert(xv);
            while ((p = strchr(xk, ' ')))
                *p = '_';

            addItem(&(osmdata->tags), xk, (char *)xv, 0);
        }
    } else if (!strcmp(name, "way")) {

        xid  = extractAttribute(token, tokens, "id");
        assert(xid);
        osmdata->osm_id   = strtoosmid((char *)xid, NULL, 10);
        osmdata->action = ParseAction(token, tokens, osmdata);

        if (osmdata->osm_id > osmdata->max_way)
            osmdata->max_way = osmdata->osm_id;
        
        if (osmdata->count_way == 0) {
            time(&osmdata->start_way);
        }
        
        osmdata->count_way++;
        if (osmdata->count_way%1000 == 0)
            printStatus(osmdata);

        osmdata->nd_count = 0;
    } else if (!strcmp(name, "nd")) {
        xid  = extractAttribute(token, tokens, "ref");
        assert(xid);

        osmdata->nds[osmdata->nd_count++] = strtoosmid( (char *)xid, NULL, 10 );

        if( osmdata->nd_count >= osmdata->nd_max )
          realloc_nodes(osmdata);
    } else if (!strcmp(name, "relation")) {
        xid  = extractAttribute(token, tokens, "id");
        assert(xid);
        osmdata->osm_id   = strtoosmid((char *)xid, NULL, 10);
        osmdata->action = ParseAction(token, tokens, osmdata);

        if (osmdata->osm_id > osmdata->max_rel)
            osmdata->max_rel = osmdata->osm_id;
        
        if (osmdata->count_rel == 0) {
            time(&osmdata->start_rel);
        }

        osmdata->count_rel++;
        if (osmdata->count_rel%10 == 0)
            printStatus(osmdata);

        osmdata->member_count = 0;
    } else if (!strcmp(name, "member")) {
        xrole = extractAttribute(token, tokens, "role");
        assert(xrole);

        xtype = extractAttribute(token, tokens, "type");
        assert(xtype);

        xid  = extractAttribute(token, tokens, "ref");
        assert(xid);

        osmdata->members[osmdata->member_count].id   = strtoosmid( (char *)xid, NULL, 0 );
        osmdata->members[osmdata->member_count].role = strdup( (char *)xrole );

        /* Currently we are only interested in 'way' members since these form polygons with holes */
        if (!strcmp(xtype, "way"))
            osmdata->members[osmdata->member_count].type = OSMTYPE_WAY;
        else if (!strcmp(xtype, "node"))
            osmdata->members[osmdata->member_count].type = OSMTYPE_NODE;
        else if (!strcmp(xtype, "relation"))
            osmdata->members[osmdata->member_count].type = OSMTYPE_RELATION;
        osmdata->member_count++;

        if( osmdata->member_count >= osmdata->member_max )
            realloc_members(osmdata);
    } else if (!strcmp(name, "add") ||
               !strcmp(name, "create")) {
        osmdata->action = ACTION_MODIFY; /* Turns all creates into modifies, makes it resiliant against inconsistant snapshots. */
    } else if (!strcmp(name, "modify")) {
        osmdata->action = ACTION_MODIFY;
    } else if (!strcmp(name, "delete")) {
        osmdata->action = ACTION_DELETE;
    } else if (!strcmp(name, "bound")) {
        /* ignore */
    } else if (!strcmp(name, "bounds")) {
        /* ignore */
    } else if (!strcmp(name, "changeset")) {
        /* ignore */
    } else {
        fprintf(stderr, "%s: Unknown element name: %s\n", __FUNCTION__, name);
    }

    /* Collect extra attribute information and add as tags */
    if (osmdata->extra_attributes && (!strcmp(name, "node") ||
				      !strcmp(name, "way") ||
				      !strcmp(name, "relation")))
    {
        char *xtmp;

        xtmp = extractAttribute(token, tokens, "user");
        if (xtmp) {
	  addItem(&(osmdata->tags), "osm_user", (char *)xtmp, 0);
        }

        xtmp = extractAttribute(token, tokens, "uid");
        if (xtmp) {
	  addItem(&(osmdata->tags), "osm_uid", (char *)xtmp, 0);
        }

        xtmp = extractAttribute(token, tokens, "version");
        if (xtmp) {
	  addItem(&(osmdata->tags), "osm_version", (char *)xtmp, 0);
        }

        xtmp = extractAttribute(token, tokens, "timestamp");
        if (xtmp) {
	  addItem(&(osmdata->tags), "osm_timestamp", (char *)xtmp, 0);
        }
    }
}