Remix.run Logo
stevage 3 days ago

The enormous difference from an infrastructure standpoint is where the arrows are happening and how much effort it is.

> OSM Database -> PNGs

This is a tile rendering farm. It takes a lot of compute power and has to be redone every time a style changes or data changes.

> OSM Database -> Vector Tiles

This is a relatively cheap data extraction process. It has to be redone when data changes.

> PNGs -> Your screen

This is extremely simple.

> Vector Tiles -> Your Screen

This is pretty complex and hard to do fast. Mapbox GL JS is the leader here and they have put a lot of resources into doing it well and fast. Maplibre GL JS is the fork, which is decent, and there are also Leaflet and OpenLayers options.

Source: This is basically my life for the last 10 years.

severak 2 days ago | parent [-]

Rendering of Vector Tiles is not that hard as all the geometry is already processed, polygons assembled and data sorted. If you have good source of vector tiles renderer itself can be relatively dumb.

I was able to implement relatively straightforward renderer in Nim language[0].

I have encountered only three hard parts:

- rendering map labels on paths (this is really hard!) - how to render labels not to be clipped by tile boundary (I had some ideas but did not implemented it yet) - collisions between labels and symbols

[0] - https://github.com/severak/lunarender3/