This put me in mind of Poisson Disc Sampling (demo and resources here).
This can be emulated easily (but slowly) by creating an aggregate function which builds a list of points which are all further than a given distance from each other. When this is called on the dataset sorted by decreasing K value, this will produce a set of points with the desired ...
You can try to compute the kernel density of your points with this function: https://gist.github.com/AbelVM/dc86f01fbda7ba24b5091a7f9b48d2ee
And after you can use this density to mitigate the K, so you would need a higher K to be displayed in a region with a lot of points.
Be aware that if you do that, multiple points can be shown even if they are close ...
You have this project that uses OpenStreetMap - http://openpoimap.org/ https://wiki.openstreetmap.org/wiki/OpenPoiMap.
With overpass api https://wiki.openstreetmap.org/wiki/Overpass_API you can extract that info