Geomap: represent data with coloured areas

here there is a sample of ours geojson:

{
"type": "FeatureCollection",
"name": "toscana_comuni_2002",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::32632" } },
"features": [
  { "type": "Feature", 
    "properties": { 
       "ID_0": 0,
       "ID_1": "051017", 
       "NAME_1": "Cortona" }, 
    "geometry": { 
    "type": "MultiPolygon", 
    "coordinates": 
    [...]

as you can see, geojson contains only maps. We have thousands of maps and thousands of columns, we can’t create a specific geojson for every data to represent.

2 Likes

Approach #1
Have you looked at the option of importing these geojson files into postgres and enabling postgis? That would be the cleanest approach I would recommend.

That is what I did

then

app.get('/postgis', (req, res) => {
    
   db.one('SELECT geo FROM public.stores', 123)
    .then((data) => {      
      //return res.json(data.geo)
      return res.status(200).send(data.geo)
    })
    .catch((error) => {
      console.log('ERROR:', error)
    }) 
})

Approach #2
Write a simple node/express rest api that reads these geojson files and provide the url to grafana. But not sure if you get new geojson data dynamically or you always have a static list

app.get('/geo', (req, res) => { 

  let rawdata = fs.readFileSync('./data/earthquakes.geojson');
  let geo = JSON.parse(rawdata);
  return res.json(geo)
})

Approach #3

Thanks for suggestions.
#1: it could be viable, but how can I then load GeoJSON in Grafana? when I choose GeoJSON as layer type it expects a file.

that is what I also thought that is has to be a file but look at the label carefully

image

GeoJSON URL. URL so this is what we did. might be a bit overkill but works perfectly for us

app.get('/postgis', (req, res) => {
    
   db.one('SELECT geo FROM public.stores', 123)
    .then((data) => {      
      //return res.json(data.geo)
      return res.status(200).send(data.geo)
    })
    .catch((error) => {
      console.log('ERROR:', error)
    }) 
})

image

I think it might be best to review your architectural approach to this whole thing. You have data scattered in a few places. They need to be centralized. you already have postgres so I would highly recommend you have it centralized there.

Thank you for your very precious suggestions.
I am new to Grafana: where do I have to put code fragments in order to create these web services as you did?

1 Like

So what I did was I created a simple rest api using nodejs/express.js

see here

If you have resources of someone that can create this simple rest api using node if not you can write it in your preferred in house web technology.

Ok, so I have to use an external software to realize a web service. There isn’t a way to do only with Grafana.
Fine, I understand. Thank you for the very complete lesson!

there might be a plugin to aggregate geojson files. not sure how many you have. let’s try json plugins

ehm, at the moment 2400 and counting. Every year in Italy some territory changes, and we have to represent data for over 25 years in at least 5 levels of detail, from Country to village.

mama mia! Mannaggia! :laughing:

As an example, please visit: https://nubia.istitutodegliinnocenti.it/index1.jsf
it’s still under development.
As you will see, maps may vary over years.
At left there are data to visualize.
As a simpler example, please see: https://www.minoritoscana.it/dati-del-territorio

I think your solution is very elegant for automated software, but difficult to let it use to my users. In Superset they choose maps, fields and values in a very simple way when they have to create a single map.
Senza titolo

1 Like

you can get close to this with grafana also using variables to choose the different filtering mechanisms

Not as mature as what you have but close?

Hi, the main problem, now, is how to color areas with different colors, graduated with data values…
suggestions?

Many thanks for the help!

What have you tried?

Geomap + geojson. I obtain values + geometries, but I can’t use values to select colors.

It looks like grafana can only create area objects from geojson static files and not from a query that returns geojson (or any geometry data). It can only work with lat/lon, geohash or lookup (but also returning lat/log)

Grafana only uses static geojson files. They can use formatting rules but those rules does not lookup any data from queries. I didn’t test but the screenshot shown here suggests that variables can be used (although the complexity will grow fast). However, without a way to use query data to setup the style, it cannot be used to represent data.

As a suggestion for grafana, I would say that we need a new layer type similar to “Markers” or “Heatmap” (or improve the existing geojson one), but with geometry where it uses lat/lon/hash/lookup.

1 Like

you might want to take a look at this fork

Thanks, @yosiasz ! It does work. However, it still needs some polishing:

  1. with geometry as a field, we do need some way to customize the popup dialog. The polygon I’m using is a little bit large and it covers the screen. The plugin github shows a “Properties” field after the “Pop up Time”, but in my case, it is missing. (It looks like I’m using the latest 1.4.4 version)
  2. the shape border is not configurable. I tried to use the mark size but it looks like it is a fixed value.
  3. Value mappings can set a color but the map ignores it.

This is just a partial screenshot to illustrate my panel:

I’ll report those issues to the github page.

1 Like

that is not accurate ^ you can enter an endpoint that returns geojson.

image

image

I wasn’t clear. I meant “grafana can only draw geojson from an external source and not from datasource queries”