[Qgis-user] Control symbol rendering in a way similar to label collision?

Cory Albrecht maps at hanfastolfe.com
Tue Feb 2 08:20:21 PST 2021


Hello all,

I am looking for a way to control symbol rendering in a way similar to how
labels are omitted ot not to prevent collision.

I want to use the GeoNames data to populating cities, towns, etc… on my
maps, but there are still millions of points even after filtering for
populated places. This is what a section of the map from
Dakotas/Montana/Wyoming looks like now, with a confused mess of overlapping
symbols. It's worse on the coasts. BTW, this layer is a points layer.

[image: image.png]

First I thought maybe Scale-based rendering by population size, but that
doesn't work, because farther out zoom levels there'd still be a mess of
overlapping symbols in heavily populated places like NYC or LA, and in less
populated places the smaller cities and towns that are important wouldn't
even show (like that black dot, which is Rapid City, SD) even though there
would be plenty of room for them.

I can control the rendering order based on population size, so is there a
way to control whether a not a symbol gets rendered based on what has
already been drawn, but ignoring what has yet to be rendered?

I'm imagining a set of stops similar to this:


   - iterate through all items in order of the population attribute
   - get the current item's location where it would potentially be rendered
   on the map
   - has anything been rendered already within 5mm (or whatever) of that
   location?
   - if yes, go to next item without rendering this one
   - if no, then render it's symbol
   - continue to next item

So after that dot which is Rapid City gets rendered, but then those
overlapping circles do not until you finally get to one with a centre 5mm
away from the centre of the Rapid City dot.

While googling I found the refFunctions plugin which adds some functions
dealing with overlaps, but since the layer is composed of points, nothing
really overlaps. Also, adding something like `*…AND (population >=
array_max(geomoverlaps('cities','population')))*` to a rule in Symbology to
exclude/include things for rendering looks at everything without
distinguishing between already rendered and yet to be rendered, like I need.

Am I thinking about this wrong and am thus missing something obvious? I
know I only use a small portion of QGIS's capabilites, so maybe there's a
tool/capability I haven't discovered yet because I haven't needed it until
now?

The layer is a PostGIS layer and this would seem to be a wholly QGIS
problem, but maybe I am wrong on that, too? Maybe there's a way of passing
the map scale in the SQL query ('SELECT *, 1.0 as map_scale FROM…') so that
some weird WHERE clause would do the filtering there? That seems unlikely
and a bit crazy, but who knows?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-user/attachments/20210202/0147dd34/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 10844 bytes
Desc: not available
URL: <http://lists.osgeo.org/pipermail/qgis-user/attachments/20210202/0147dd34/attachment.png>


More information about the Qgis-user mailing list