source: subversion/applications/utils/osmgenerate/osmgenerate.c @ 29705

Last change on this file since 29705 was 4453, checked in by jonb, 12 years ago

osmgenerate: Trivial tool to generate OSM test data

File size: 4.2 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <math.h>
4#include <time.h>
5#include <libgen.h>
6
7#define INDENT "    "
8
9
10
11void create_data(int ways, int segs_per_way, int negative)
12{
13    int id, way, phase;
14    int nodes_per_way = segs_per_way + 1;
15    double sqrt_ways = sqrt(ways * 1.0) + 1.0;
16    const char *sign = negative ? "-" : "";
17
18    for (phase = 0; phase < 3; phase++) {
19        for (way=0; way < ways; way++) {
20            int visible = way % 2; // Every alternate way is deleted
21            int node_offset = 1 + way * nodes_per_way;
22            int seg_offset  = 1 + way * segs_per_way;
23            time_t t = 31 * 365 * 24 * 60 * 60 + way;
24            struct tm *ts = gmtime(&t);
25
26            switch(phase) {
27                case 0: { // Nodes, place in a grid like pattern
28                    double lon = (90.0 * way) / ways - 45.0;
29                    double lat = (way % ((int)sqrt_ways)) * (90.0 / sqrt_ways) - 45.0;
30                    double lat_per = (90.0 / sqrt_ways) / (nodes_per_way + 1.0);
31
32                    //  <node id='17233948' timestamp='2007-08-04 22:24:51' visible='true' lat='45.4052394197691' lon='-75.6987485112884' />
33                    for (id = 0; id < nodes_per_way; id++) {
34                        printf(INDENT "<node id='%s%d' timestamp='%d-%d-%d %d:%d:%d' visible='%s' lat='%.8f' lon='%.8f' />\n",
35                               sign, node_offset + id, ts->tm_year + 1900, ts->tm_mon, ts->tm_mday, ts->tm_hour, ts->tm_min, ts->tm_sec,
36                               visible ? "true" : "false", lat + lat_per * id, lon);
37                    }
38                }
39                break;
40                   
41                case 1: // Segments
42                    // <segment id='13794186' timestamp='2007-08-04 22:28:47' visible='true' from='17233948' to='24959146' />
43                    for (id = 0; id < segs_per_way; id++) {
44                        printf(INDENT "<segment id='%s%d' timestamp='%d-%d-%d %d:%d:%d' visible='%s' from='%s%d' to='%s%d' />\n",
45                               sign, seg_offset + id, ts->tm_year + 1900, ts->tm_mon, ts->tm_mday, ts->tm_hour, ts->tm_min, ts->tm_sec,
46                               visible ? "true" : "false", sign, node_offset + id, sign, node_offset + id + 1);
47                    }
48
49                    break;
50                   
51                    case 2: // Ways
52                        printf(INDENT "<way id='%s%d' timestamp='%d-%d-%d %d:%d:%d' visible='%s'>\n",
53                               sign, way + 1, ts->tm_year + 1900, ts->tm_mon, ts->tm_mday, ts->tm_hour, ts->tm_min, ts->tm_sec,
54                               visible ? "true" : "false");
55
56                        for (id = 0; id < segs_per_way; id++)
57                            printf(INDENT INDENT "<seg id='%s%d' />\n", sign, seg_offset + id);
58
59                        printf(INDENT INDENT "<tag k='name' v='way%d' />\n", way);
60                        printf(INDENT INDENT "<tag k='highway' v='primary' />\n");
61                        printf(INDENT "</way>\n");
62                        break;
63            }
64        }
65        printf("\n");
66    }
67}
68
69
70int main(int argc, char **argv)
71{
72    int ways = 0, segs_per_way = 0;
73
74    if (argc < 3) {
75      const char *name = basename(argv[0]);
76      fprintf(stderr, "Usage:\n");
77      fprintf(stderr, "\t%s <num-ways> <segments-per-way>\n", name);
78      fprintf(stderr, "\n\nThis is a trival tool to generate OSM data of an arbitrary size.\n");
79      fprintf(stderr, "This may be used to test the performance and scalability of a variety of OSM tools.\n");
80      fprintf(stderr, "\ne.g. %s 1000 4 > fake1k.osm\n", name);
81      fprintf(stderr, "     josm fake1k.osm\n\n");
82      fprintf(stderr, "This is intended as a tool for developers. If you want something other than a simple\n");
83      fprintf(stderr, "grid of ways then you will have to edit the source!\n\n");
84     
85      return 1;
86    }
87
88    ways = strtoul(argv[1], NULL, 10);
89    segs_per_way = strtoul(argv[2], NULL, 10);
90
91    fprintf(stderr, "Creating %d ways with %d segments per way.\n\n", ways, segs_per_way);
92
93    printf("<?xml version='1.0' encoding='UTF-8'?>\n");
94    printf("<osm version='0.3' generator='dbscale'>\n");
95    create_data(ways, segs_per_way, 1);
96    printf("</osm>\n");
97
98    return 0;
99}
Note: See TracBrowser for help on using the repository browser.