added tagging of two-node ways created from tagged or unwayed segments. untested.
This commit is contained in:
parent
9d57643812
commit
4bbe59a0c4
1 changed files with 78 additions and 58 deletions
|
@ -67,6 +67,7 @@ struct data {
|
|||
size_t segs_len;
|
||||
struct segment *segs;
|
||||
unsigned char *rem_segs;
|
||||
unsigned char *tgd_segs;
|
||||
|
||||
FILE *ways, *way_nodes, *way_tags,
|
||||
*relations, *relation_members, *relation_tags;
|
||||
|
@ -114,7 +115,9 @@ static void populate_segs(struct data *d) {
|
|||
memset(d->segs, 0, sizeof(struct segment) * d->segs_len);
|
||||
|
||||
d->rem_segs = (unsigned char *) malloc(d->segs_len);
|
||||
d->tgd_segs = (unsigned char *) malloc(d->segs_len);
|
||||
memset(d->rem_segs, 0, d->segs_len);
|
||||
memset(d->tgd_segs, 0, d->segs_len);
|
||||
|
||||
if (mysql_query(d->mysql, "SELECT id, node_a, node_b "
|
||||
"FROM current_segments WHERE visible"))
|
||||
|
@ -274,22 +277,22 @@ static void convert_ways(struct data *d) {
|
|||
node_list.push_back(segs.front().to);
|
||||
segs.pop_front();
|
||||
while (true) {
|
||||
bool found = false;
|
||||
for (list<segment>::iterator it = segs.begin();
|
||||
it != segs.end(); ) {
|
||||
if (it->from == node_list.back()) {
|
||||
node_list.push_back(it->to);
|
||||
segs.erase(it++);
|
||||
found = true;
|
||||
} else if (it->to == node_list.front()) {
|
||||
node_list.insert(node_list.begin(), it->from);
|
||||
segs.erase(it++);
|
||||
found = true;
|
||||
} else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
if (!found) break;
|
||||
bool found = false;
|
||||
for (list<segment>::iterator it = segs.begin();
|
||||
it != segs.end(); ) {
|
||||
if (it->from == node_list.back()) {
|
||||
node_list.push_back(it->to);
|
||||
segs.erase(it++);
|
||||
found = true;
|
||||
} else if (it->to == node_list.front()) {
|
||||
node_list.insert(node_list.begin(), it->from);
|
||||
segs.erase(it++);
|
||||
found = true;
|
||||
} else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
if (!found) break;
|
||||
}
|
||||
node_lists.push_back(node_list);
|
||||
}
|
||||
|
@ -297,14 +300,14 @@ static void convert_ways(struct data *d) {
|
|||
vector<uint64_t> ids; ids.reserve(node_lists.size());
|
||||
bool orig_id_used = false;
|
||||
for (list<list<uint32_t> >::iterator it = node_lists.begin();
|
||||
it != node_lists.end(); ++it) {
|
||||
it != node_lists.end(); ++it) {
|
||||
uint64_t way_id;
|
||||
int sid;
|
||||
if (orig_id_used) {
|
||||
way_id = d->new_way_id++;
|
||||
way_id = d->new_way_id++;
|
||||
} else {
|
||||
way_id = id;
|
||||
orig_id_used = true;
|
||||
way_id = id;
|
||||
orig_id_used = true;
|
||||
}
|
||||
ids.push_back(way_id);
|
||||
|
||||
|
@ -314,8 +317,8 @@ static void convert_ways(struct data *d) {
|
|||
|
||||
sid = 1;
|
||||
for (list<uint32_t>::iterator nit = it->begin();
|
||||
nit != it->end(); ++nit) {
|
||||
fprintf(d->way_nodes, "\"" F_U64 "\",\"" F_U32 "\",\"%i\"\n", way_id, *nit, sid++);
|
||||
nit != it->end(); ++nit) {
|
||||
fprintf(d->way_nodes, "\"" F_U64 "\",\"" F_U32 "\",\"%i\"\n", way_id, *nit, sid++);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -330,26 +333,26 @@ static void convert_ways(struct data *d) {
|
|||
|
||||
while (!mysql_stmt_fetch(load_tags)) {
|
||||
if (multiple_parts && !create_multipolygon) {
|
||||
if (!strcmp(k, "natural")) {
|
||||
if (strcmp(v, "coastline")) {
|
||||
create_multipolygon = true;
|
||||
}
|
||||
} else if (!strcmp(k, "waterway")) {
|
||||
if (!strcmp(v, "riverbank")) {
|
||||
create_multipolygon = true;
|
||||
}
|
||||
} else if (!strcmp(k, "leisure") || !strcmp(k, "landuse")
|
||||
|| !strcmp(k, "sport") || !strcmp(k, "amenity")
|
||||
|| !strcmp(k, "tourism") || !strcmp(k, "building")) {
|
||||
create_multipolygon = true;
|
||||
}
|
||||
if (!strcmp(k, "natural")) {
|
||||
if (strcmp(v, "coastline")) {
|
||||
create_multipolygon = true;
|
||||
}
|
||||
} else if (!strcmp(k, "waterway")) {
|
||||
if (!strcmp(v, "riverbank")) {
|
||||
create_multipolygon = true;
|
||||
}
|
||||
} else if (!strcmp(k, "leisure") || !strcmp(k, "landuse")
|
||||
|| !strcmp(k, "sport") || !strcmp(k, "amenity")
|
||||
|| !strcmp(k, "tourism") || !strcmp(k, "building")) {
|
||||
create_multipolygon = true;
|
||||
}
|
||||
}
|
||||
|
||||
for (vector<uint64_t>::iterator it = ids.begin();
|
||||
it != ids.end(); ++it) {
|
||||
fprintf(d->way_tags, "\"" F_U64 "\",", *it);
|
||||
write_csv_col(d->way_tags, k, ',');
|
||||
write_csv_col(d->way_tags, v, '\n');
|
||||
it != ids.end(); ++it) {
|
||||
fprintf(d->way_tags, "\"" F_U64 "\",", *it);
|
||||
write_csv_col(d->way_tags, k, ',');
|
||||
write_csv_col(d->way_tags, v, '\n');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -361,12 +364,12 @@ static void convert_ways(struct data *d) {
|
|||
write_csv_col(d->relations, timestamp, '\n');
|
||||
|
||||
fprintf(d->relation_tags,
|
||||
"\"" F_U64 "\",\"type\",\"multipolygon\"\n", ent_id);
|
||||
"\"" F_U64 "\",\"type\",\"multipolygon\"\n", ent_id);
|
||||
|
||||
for (vector<uint64_t>::iterator it = ids.begin();
|
||||
it != ids.end(); ++it) {
|
||||
fprintf(d->relation_members,
|
||||
"\"" F_U64 "\",\"way\",\"" F_U64 "\",\"\"\n", ent_id, *it);
|
||||
it != ids.end(); ++it) {
|
||||
fprintf(d->relation_members,
|
||||
"\"" F_U64 "\",\"way\",\"" F_U64 "\",\"\"\n", ent_id, *it);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -464,13 +467,13 @@ static void mark_tagged_segs(struct data *d) {
|
|||
char *tags_it = row[1], *k, *v;
|
||||
while (read_seg_tags(&tags_it, &k, &v)) {
|
||||
if (strcmp(k, "created_by") &&
|
||||
strcmp(k, "tiger:county") &&
|
||||
strcmp(k, "tiger:upload_uuid") &&
|
||||
strcmp(k, "converted_by") &&
|
||||
(strcmp(k, "width") || strcmp(v, "4")) &&
|
||||
(strcmp(k, "natural") || strcmp(v, "coastline")) &&
|
||||
(strcmp(k, "source") || strncmp(v, "PGS", 3))) {
|
||||
interesting_tags.insert(make_pair(string(k), string(v)));
|
||||
strcmp(k, "tiger:county") &&
|
||||
strcmp(k, "tiger:upload_uuid") &&
|
||||
strcmp(k, "converted_by") &&
|
||||
(strcmp(k, "width") || strcmp(v, "4")) &&
|
||||
(strcmp(k, "natural") || strcmp(v, "coastline")) &&
|
||||
(strcmp(k, "source") || strncmp(v, "PGS", 3))) {
|
||||
interesting_tags.insert(make_pair(string(k), string(v)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -486,16 +489,17 @@ static void mark_tagged_segs(struct data *d) {
|
|||
|
||||
while (!mysql_stmt_fetch(way_tags)) {
|
||||
for (map<string, string>::iterator it = interesting_tags.find(wk);
|
||||
it != interesting_tags.end() && it->first == wk; ++it) {
|
||||
if (it->second == wv) {
|
||||
interesting_tags.erase(it);
|
||||
break;
|
||||
}
|
||||
it != interesting_tags.end() && it->first == wk; ++it) {
|
||||
if (it->second == wv) {
|
||||
interesting_tags.erase(it);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (interesting_tags.size() > 0) {
|
||||
d->rem_segs[id] = 1;
|
||||
d->tgd_segs[id] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -512,6 +516,7 @@ static void convert_remaining_segs(struct data *d) {
|
|||
const size_t max_tag_len = 1 << 16;
|
||||
char *tags, timestamp[100];
|
||||
char *k, *v;
|
||||
char notetmp[1024];
|
||||
int user_id;
|
||||
long long mysql_id;
|
||||
unsigned long res_len;
|
||||
|
@ -558,6 +563,7 @@ static void convert_remaining_segs(struct data *d) {
|
|||
|
||||
for (size_t seg_id = 0; seg_id < d->segs_len; seg_id++) {
|
||||
if (!d->rem_segs[seg_id]) continue;
|
||||
const char *what = d->tgd_segs[seg_id] ? "tagged" : "unwayed";
|
||||
segment seg = d->segs[seg_id];
|
||||
|
||||
mysql_id = seg_id;
|
||||
|
@ -574,10 +580,23 @@ static void convert_remaining_segs(struct data *d) {
|
|||
fprintf(d->way_nodes, "\"" F_U64 "\",\"" F_U32 "\",\"%i\"\n", way_id, seg.to, 2);
|
||||
|
||||
char *tags_it = tags;
|
||||
bool note = false;
|
||||
while (read_seg_tags(&tags_it, &k, &v)) {
|
||||
fprintf(d->way_tags, "\"" F_U64 "\",", way_id);
|
||||
write_csv_col(d->way_tags, k, ',');
|
||||
write_csv_col(d->way_tags, v, '\n');
|
||||
fprintf(d->way_tags, "\"" F_U64 "\",", way_id);
|
||||
write_csv_col(d->way_tags, k, ',');
|
||||
if(!strcmp(k,"note")) {
|
||||
snprintf(notetmp, sizeof(notetmp), "%s; FIXME previously %s segment", v, what);
|
||||
note = true;
|
||||
write_csv_col(d->way_tags, notetmp, '\n');
|
||||
} else {
|
||||
write_csv_col(d->way_tags, v, '\n');
|
||||
}
|
||||
}
|
||||
if (!note) {
|
||||
sprintf(notetmp, "FIXME previously %s segment", what);
|
||||
fprintf(d->way_tags, "\"" F_U64 "\",", way_id);
|
||||
write_csv_col(d->way_tags, "note", ',');
|
||||
write_csv_col(d->way_tags, notetmp, '\n');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -666,6 +685,7 @@ int main(int argc, char **argv) {
|
|||
|
||||
free(d->segs);
|
||||
free(d->rem_segs);
|
||||
free(d->tgd_segs);
|
||||
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue