This is too long for comment, but here is just the idea of how I will “play” with it and see if I can come up with something interesting. But one thing is certain: it can be done very quickly.
Could this be easily translated into some discrete problem? First, you align all your coordinates to a large map (you determine how big each square is, and you make each map enter one such point). Then you would get something like this:
0000000000000000000000000000 00XX000000000000000000X00000 00X00000000000000X0000000000 0000000000000000000000000000 0000000000000000000000000000 000000X00000000X000000000000 0000000000000000000000000000 000000000000X000000000X00000 00000000000000000000000X0000 0000000000000000000000000000
Then you calculate each record and the number of neighboring neighbors:
0000000000000000000000000000 0033000000000000000001000000 0030000000000000010000000000 0000000000000000000000000000 0000000000000000000000000000 0000001000001001000000000000 0000000000000000000000000000 0000000000001010000000200000 0000000000000000000000020000 0000000000000100000000000000
Then you can increase the size of your square, say, by two and, therefore, divide the map:
(the card is incorrect, this is to give an idea of what I'm thinking)
09001001000000 00000000000000 00100001100000 00000110002000 00000002000000 00000100000000
Then you re-read neighboring neighbors, etc.
For me, this would allow me to find an access point depending on your “permission”: you would just look for the largest numbers, and these would be your “hot spots”.
Because in this case:
0000X00000 0000XX0000 0000000000 0000000000 0Y0Y000000 0000000000 0Y0Y000000
Either “X” can be the hottest spot (three interesting points that are close to each other), or “Y” (four points are close to each other, but they are not as close as for “X”).
Since you said you need speed, I will just turn this into a discrete problem and present my graphs as arrays. Then I would allow a variable size of "area".
Sounds like a fun problem to work with :)