> Thank you again; results are starting to come in.
> 
> Apologies for starting a new thread; but the other one was getting messy.
> 
> Here are the queries that I am testing:
> SELECT city, state, ST_ClusterDBScan( ST_Transform(geom,2163), eps :=
> 0.3048*5000, minpoints :=1) OVER () AS cluster_id INTO TEMP aa_zz FROM
> shapefiles.atp_filling_stations aa WHERE aa.amenity = 'fuel'
> AND aa.ctry_code = 'US' AND aa.geom IS NOT NULL;
> 
> SELECT cluster_id, COUNT(*) FROM aa_zz GROUP BY 1 ORDER BY 2 DESC
> LIMIT 10;
> 
> SELECT state,  cluster_id, COUNT(*) FROM aa_zz GROUP BY 2, 1 ORDER BY 3
> DESC LIMIT 20;
> 
> SELECT city, state,  cluster_id, COUNT(*) FROM aa_zz GROUP BY 3, 2, 1
> ORDER BY 4 DESC LIMIT 20;
> 
> 
> I receive the following results:
> SELECT 76023
>   cluster_id | count
> ------------+-------
>         8467 |   422
>         3888 |   371
>         5701 |   249
>         3351 |   177
>         1111 |   141
>         8352 |   120
>         1610 |   107
>         1812 |    90
>         1824 |    86
>        14232 |    81
> (10 rows)
> 
>   state | cluster_id | count
> -------+------------+-------
>   MI    |       8467 |   422
>   NY    |       3888 |   371
>   IL    |       5701 |   245
>   NY    |       3351 |   177
>   CO    |       8352 |   110
>   TX    |       1610 |   101
>   NY    |       1824 |    86
>   DC    |       1111 |    82
>   IN    |      14748 |    78
>   TX    |      14297 |    75
>   MO    |       3661 |    74
>   CA    |      11272 |    74
>   MI    |        462 |    71
>   TX    |      14232 |    70
>   TX    |      19326 |    69
>   TX    |       1812 |    68
>   FL    |      13693 |    68
>   TX    |      16824 |    68
>   CA    |      14006 |    66
>   IL    |       2727 |    64
> (20 rows)
> 
>       city     | state | cluster_id | count
> --------------+-------+------------+-------
>   DETROIT      | MI    |       8467 |   147
>   CHICAGO      | IL    |       5701 |   104
>   Austin       | TX    |       1610 |   101
>   Detroit      | MI    |       8467 |    85
>   BROOKLYN     | NY    |       3888 |    77
>   Chicago      | IL    |       5701 |    75
>   Fresno       | CA    |      11272 |    73
>   Brooklyn     | NY    |       3888 |    71
>   WASHINGTON   | DC    |       1111 |    66
>   HOUSTON      | TX    |      14297 |    64
>   St. Louis    | MO    |       3661 |    63
>   HOUSTON      | TX    |      14232 |    63
>   DENVER       | CO    |       8352 |    54
>   BRONX        | NY    |       3351 |    53
>   LOS ANGELES  | CA    |      14006 |    50
>   Bakersfield  | CA    |       1777 |    49
>   INDIANAPOLIS | IN    |      14748 |    44
>   Bronx        | NY    |       3351 |    42
>   Amarillo     | TX    |        622 |    41
>   Austin       | TX    |       1601 |    38
> (20 rows)
> 
> 
> Obviously, the case-based aspect of the city name can be cancelled with a
> function such as UPPER(city).
> 
> I also am generous in the radius dimension setting it at 5k feet.
> 
> But my next question is how do position the cluster_id on a map w/o
> referencing the city, and then tying that out to a geometry that I have
> stored for the city?
> 
> Thank you again,
> 
> Max

Depends how you want to show the cluster. If you want to show like a bubble
to represent the cluster, you can probably using ST_MinimumBoundingCircle
https://postgis.net/docs/en/ST_MinimumBoundingCircle.html  
First by keeping the point geometry

CREATE TEMP TABLE tmp_aa_zz AS 
SELECT city, state, ST_ClusterDBScan( ST_Transform(geom,2163), eps :=
 0.3048*5000, minpoints :=1) OVER () AS cluster_id, aa.geom 
FROM
 shapefiles.atp_filling_stations aa WHERE aa.amenity = 'fuel'
AND aa.ctry_code = 'US' AND aa.geom IS NOT NULL;


SELECT cluster_id , ST_MinimumBoundingCircle(ST_Collect(geom)) AS geom,
COUNT(*)
FROM tmp_aa_zz
GROUP BY cluster_id;

Or you might want to show the individual points in which case you can
dispense with the ST_MinimumBoundingCircle call or have it in addition to
like: 

SELECT cluster_id , ST_Collect(ST_MinimumBoundingCircle(ST_Collect(geom)),
ST_Collect(geom)) AS geom, COUNT(*)
FROM tmp_aa_zz
GROUP BY cluster_id;

Other alternative options you can try besides the minimum bounding circle
might be ST_ConvexHull  https://postgis.net/docs/en/ST_ConvexHull.html
, ST_ConcaveHull https://postgis.net/docs/en/ST_ConcaveHull.html, or maybe
even ST_GeometricMedian https://postgis.net/docs/en/ST_GeometricMedian.html
(if you want to show only one point to represent all the points or
ST_Centroid ( I think ST_GeometricMedian would be a more accurate
representation though, think of centroid as the average so would be highly
affected by outlier points where as the median would be less so)



Reply via email to