Creating vector tiles using Node-Mapnik + PostGIS (500 (internal server error))

I am trying to create web tiles with vector tiles on a google map. I use:

  • mapnik
  • node.js
  • node-mapnik
  • postGIS

I use port 8000 (127.0.0.1:8000) to display a tile map

var mapTiles = {
    tilejson: '1.0.0',
    scheme: 'xyz',
    tiles: ['127.0.0.1:8000/{z}/{x}/{y}.png'],
    formatter: function(options, data) { return data.NAME }
};

And I have server.js, I use this file to create a server.

    http.createServer(function(req, res) {
  parseXYZ(req, TMS_SCHEME, function(err,params) {
    if (err) {
      res.writeHead(500, {'Content-Type': 'text/plain'});
      res.end(err.message);
    } else {
      try {
        var map = new mapnik.Map(256, 256, mercator.proj4);
        var layer = new mapnik.Layer('tile', mercator.proj4);
        var postgis = new mapnik.Datasource(postgis_settings); // settings defined above
        var bbox = mercator.xyz_to_envelope(parseInt(params.x),
                                               parseInt(params.y),
                                               parseInt(params.z), false); // coordinates provided by the sphericalmercator.js script
        layer.datasource = postgis; 
        layer.styles = ['polygon']; // this pertains the the style in the xml doc
        map.bufferSize = 0; // how much edging is provided for each tile rendered
        map.load(path.join(__dirname, 'tile_symbols.xml'), {strict: true}, function(err,map) {
            if (err) throw err;
            map.add_layer(layer);
            map.extent = bbox;
            var im = new mapnik.Image(map.width, map.height);
            map.render(im, function(err, im) {
              if (err) {
                throw err;
              } else {
                res.writeHead(200, {'Content-Type': 'image/png'});
                res.end(im.encodeSync('png'));
              }
            }); 
        });

      }
      catch (err) {
        res.writeHead(500, {'Content-Type': 'text/plain'});
        res.end(err.message);
      }
    }
  });
}).listen(port);

After that, I started the service > node server.js, receiving a success message server running on port 8000. Then I try to check if my code works or not, and I found some problems:

  • I try to access 127.0.0.1:8000, I get no x,y,z provided
  • If I access the file index.html( http://localhost/webmaps/), the polygon does not appear on the map, and I get 500 (Internal Server Error)-Could not create datasource for type: 'postgis' (no datasource plugin directories have been successfully registered)

- ? - Google, .

+4

Source: https://habr.com/ru/post/1589211/


All Articles