J'utilise PostGIS pour calculer les voisins les plus proches des polygones. Ce que je veux calculer, c'est la distance minimale entre chaque polygone et le polygone le plus proche.
Jusqu'à présent, j'ai obtenu une grande aide de la réponse de Mike Toews (que je cite avec un changement mineur) ici:
SELECT
a.hgt AS a_hgt,
b.hgt AS b_hgt,
ST_Distance(a.the_geom, b.the_geom) AS distance_between_a_and_b
FROM
public."TestArea" AS a, public."TestArea" AS b
WHERE
a.hgt != b.hgt AND ST_Distance(a.the_geom, b.the_geom) < 400
Ensuite, j'ai calculé le minimum:
SELECT a_hgt, MIN(distance_between_a_and_b)
FROM public."lon_TestArea"
GROUP BY a_hgt
Cependant, mon défi est de calculer cela pour un grand nombre de polygones (1 000 000). Comme le calcul ci-dessus compare chaque polygone à tous les autres polygones, je me suis demandé comment améliorer le calcul afin de ne pas avoir à effectuer 10 ^ 12 calculs.
J'ai pensé que je devais tamponner chaque polygone, puis calculer les voisins les plus proches de toutes les valeurs dans le tampon pour ce polygone et enregistrer le minimum. Je ne sais pas si c'est la meilleure approche, ou s'il y a une fonction dans PostGIS que je devrais utiliser.
EDIT: En utilisant l'une des suggestions de Nicklas, j'expérimente avec ST_Dwithin()
:
CREATE TABLE mytable_withinRange AS SELECT
a.hgt AS a_hgt,
b.hgt AS b_hgt,
ST_DWithin(a.the_geom, b.the_geom, 400)
FROM
public."lon_TestArea" AS a, public."lon_TestArea" AS b
Cela renvoie un tableau de l'ID de chaque polygone, et s'il se trouve dans une certaine distance ou non. Est-il possible de construire une IF/ELSE
instruction de type en utilisant SQL? (J'ai lu comment utiliser la CASE
condition) Ou dois-je essayer de joindre la table que je produis à la table d'origine, puis d'exécuter à nouveau la requête à l'aide de ST_Distance?