5 votos

Encontrar el número de puntos dentro de un radio determinado de un conjunto de puntos

Tengo dos tablas. Una es una lista de tiendas (con lat/long). La otra es una lista de direcciones de clientes (con lat/long). Lo que quiero es una consulta que devuelva el número de clientes en un radio determinado para cada tienda de mi tabla. Esto me da el número total de clientes en un radio de 10.000 metros de CUALQUIER tienda, pero no estoy seguro de cómo hacer un bucle para devolver una fila para cada tienda con un recuento.

Tenga en cuenta que estoy haciendo estas consultas utilizando cartoDB, donde the_geom es básicamente largo/plano.

SELECT COUNT(*) as customer_count FROM customer_table 
WHERE EXISTS(
    SELECT 1 FROM store_table
    WHERE ST_Distance_Sphere(store_table.the_geom, customer_table.the_geom) < 10000
)

El resultado es una sola fila:

customer_count
4009

¿Sugerencias sobre cómo hacer que esto funcione contra mi problema? Estoy abierto a hacer esto de otras maneras que podrían ser más eficientes (más rápido).

Como referencia, la columna con los nombres de las tiendas, que estaría en una columna es store_identifier.store_table

13voto

PhiLho Puntos 23458

Hay una consulta sencilla para este caso.

SELECT a.id AS store,count(b.*) AS customer_count FROM stores a, customers b 
    WHERE ST_DWithin(a.geom::geography,b.geom::geography,5000) GROUP BY a.id

He almacenado mis datos de muestra en la proyección WGS 84 (4326). Cuando se quiere utilizar un sistema métrico, hay que convertir las geometrías al formato geográfico.

enter image description here

El resultado de mi consulta:

store   customer_count
1       2
2       4
3       2

EDITAR Para obtener el porcentaje de todos los clientes y de los clientes que se encuentran en una zona determinada, se puede utilizar un WITH consulta (¡no se ha probado!):

WITH all_customers AS (
    SELECT count(*) AS all_customers 
    FROM customers
    )
        SELECT 
            a.id AS store,
            count(b.*) AS customer_count,
            count(b.*)/c.all_customers*100 AS percentage
        FROM stores a, customers b, all_customers c
            WHERE ST_DWithin(a.geom::geography,b.geom::geography,5000)
                GROUP BY a.id

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X