1 | var http = require('http');
|
2 | var url = require('url');
|
3 | var querystring = require('querystring');
|
4 | var osmToGeoJson = require('./lib/OsmToGeoJson.js');
|
5 | var geoJsonToX3dJson = require('./lib/GeoJsonToX3dJson.js');
|
6 | var x3dJsonToX3d = require('./lib/X3dJsonToX3d.js')
|
7 |
|
8 | var server = http.createServer(function (request, response) {
|
9 | var page = url.parse(request.url).pathname;
|
10 | console.log("page:" + page);
|
11 | if (page != '/3dbox') {
|
12 | response.writeHead(404, {"Content-Type": "text/html"});
|
13 | response.end();
|
14 | return;
|
15 | }
|
16 | var args = querystring.parse(url.parse(request.url).query);
|
17 | console.log(args);
|
18 | if ('format' in args && 'zoom' in args && 'xtile' in args && 'ytile' in args) {
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 | if (args.zoom >= 16 && args.zoom <= 19) {
|
33 | var loD = args.zoom - 15;
|
34 | var left = tile2long(+args.xtile, args.zoom);
|
35 | var right = tile2long(+args.xtile + 1, args.zoom);
|
36 | var top = tile2lat(+args.ytile, args.zoom);
|
37 | var bottom = tile2lat(+args.ytile + 1, args.zoom);
|
38 | var myPath = "/api/0.6/map?bbox=" + left + "," + bottom + "," + right + "," + top;
|
39 | console.log("Path: " + myPath);
|
40 | console.log('<bounds minlat="' + bottom + '" minlon="' + left + '" maxlat="' + top + '" maxlon="' + right + '"/>');
|
41 | console.log('<bounds minlat="40.7481926" minlon="-73.9862797" maxlat="40.7486022" maxlon="-73.9852939"/>');
|
42 | var options = {
|
43 | hostname: 'www.openstreetmap.org',
|
44 | port: 80,
|
45 | path: myPath,
|
46 | method: 'GET',
|
47 | };
|
48 | var request = http.request(options, function (osmReadStream) {
|
49 | console.log('Get osm map response.')
|
50 | var onX3dJsonConvert;
|
51 | var onGeoJsonConvert;
|
52 | var options = {
|
53 | 'origin': [left, top],
|
54 | 'loD': loD,
|
55 | 'tile': 'http://a.tile.openstreetmap.org/' + args.zoom + '/' + args.xtile + '/' + args.ytile + '.png'
|
56 | }
|
57 | switch (args.format) {
|
58 | case "geojson":
|
59 | console.log("geojson format.");
|
60 | onGeoJsonConvert = function (geoJson) {
|
61 | console.timeEnd("server");
|
62 | console.log('Conversion to geoJson done.');
|
63 | response.setHeader('Content-Type', 'application/json');
|
64 | response.end(JSON.stringify(geoJson));
|
65 | }
|
66 |
|
67 | break;
|
68 | case "x3djson":
|
69 | console.log("x3djson format.");
|
70 | onX3dJsonConvert = function (x3dJsonScene) {
|
71 | console.timeEnd("server");
|
72 | console.log('Conversion to x3dJson done.');
|
73 | response.setHeader('Content-Type', 'application/json');
|
74 | response.end(JSON.stringify(x3dJsonScene));
|
75 | };
|
76 | onGeoJsonConvert = function (geoJson) {
|
77 | console.timeEnd("server");
|
78 | console.log('Conversion to geoJson done.');
|
79 |
|
80 | geoJsonToX3dJson.convert(geoJson, options, onX3dJsonConvert);
|
81 | }
|
82 | break;
|
83 | case "x3d":
|
84 | console.log("x3djson format.");
|
85 | onX3dJsonConvert = function (x3dJsonScene) {
|
86 | console.timeEnd("server");
|
87 | console.log('Conversion to x3dJson done.');
|
88 | response.setHeader('Content-Type', 'application/json');
|
89 | x3dJsonToX3d.convert(x3dJsonScene, response);
|
90 | response.end();
|
91 | };
|
92 | onGeoJsonConvert = function (geoJson) {
|
93 | console.timeEnd("server");
|
94 | console.log('Conversion to geoJson done.');
|
95 | geoJsonToX3dJson.convert(geoJson, options, onX3dJsonConvert);
|
96 | }
|
97 | break;
|
98 | }
|
99 | if (onGeoJsonConvert) {
|
100 |
|
101 | var osmToGeoJsonWriteStream = osmToGeoJson.convert(options, onGeoJsonConvert);
|
102 | console.log('Starting conversion...');
|
103 | console.time("server");
|
104 | osmReadStream.pipe(osmToGeoJsonWriteStream);
|
105 | } else {
|
106 | response.end();
|
107 | }
|
108 | });
|
109 | request.on('error', function (e) {
|
110 | console.log('problem with request: ' + e.message);
|
111 | });
|
112 | request.end();
|
113 | }
|
114 | } else {
|
115 | console.log("fallback");
|
116 | }
|
117 | });
|
118 | server.listen(8081);
|
119 |
|
120 | function tile2long(x, z) {
|
121 | return (x / Math.pow(2, z) * 360 - 180);
|
122 | }
|
123 |
|
124 | function tile2lat(y, z) {
|
125 | var n = Math.PI - 2 * Math.PI * y / Math.pow(2, z);
|
126 | return (180 / Math.PI * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n))));
|
127 | } |
\ | No newline at end of file |