Après - je ne sais pas ce qui s'est passé - toutes mes entrées dans mes tables PostGIS sont doublées! J'ai essayé cela pour les supprimer mais cela ne supprime aucun / tous les doublons:
DELETE FROM planet_osm_point
WHERE osm_id NOT IN (SELECT min(osm_id)
FROM planet_osm_point
GROUP BY osm_id)
ou ca:
DELETE FROM planet_osm_point
WHERE osm_id NOT IN (
select max(dup.osm_id)
from planet_osm_point as dup
group by way);
ÉDITER:
J'ai finalement trouvé un moyen simple, qui fonctionne dans mon cas:
DELETE FROM planet_osm_point WHERE ctid NOT IN
(SELECT max(ctid) FROM planet_osm_point GROUP BY osm_id);
trouvé sur cette page: http://technobytz.com/most-useful-postgresql-commands.html
qgis
postgis
osm2pgsql
duplication
CARTE
la source
la source
planet_osm_point
structure actuelle du tableau? signifie le type de colonnes. Vous pouvez écrire un code Python de base pour collecter les colonnes sélectionnées, si vous rencontrez des difficultés avec les fonctions SQL.ctid
approche. Cette colonne a été ajoutée manuellement après l'événement de duplication?Réponses:
Pour ce faire, vous pouvez utiliser une fonction de fenêtre et une partition par géométrie, de sorte que chaque géométrie répétée reçoive un identifiant: 1, 2, 3, etc. (ou 1, 2) dans votre cas, puis sélectionnez simplement table où l'id = 1, pour récupérer un ensemble unique de valeurs (attributs et géométrie), par exemple,
Évidemment, vous devrez également ajouter les autres colonnes osm dans la sélection, c'est juste à titre d'illustration, mais cela revient essentiellement à grouper par géométrie et à sélectionner simplement la première instance de chacune. Remarque, vous devez utiliser ST_AsBinary dans la partition par sinon la comparaison est effectuée sur le cadre de sélection, pas sur la géométrie réelle.
Comme tous les autres attributs sont probablement les mêmes pour chaque paire de géométries, vous devriez donc quelque chose comme ça pour tous les autres champs, y compris osm_id, et pour réellement créer une nouvelle table unique:
Cela peut être plus rapide que la suppression d'une table existante, surtout s'il y a beaucoup d'index en place.
MODIFIER . Réécrit pour la lisibilité, mais, laissant le crédit à dbaston pour avoir attiré mon attention sur ST_AsBinary (geom)
la source
Partition By
?PARTITION BY
utilise l'=
opérateur, qui fonctionne sur l'égalité de la boîte englobante). Je suggère de remplacer ce qui précèdePARTITION BY ST_AsBinary(geom)
par un correctif.Voici une autre méthode que j'ai utilisée pour supprimer les doublons d'un téléchargement de données de sol SSURGO. Les fichiers de formes téléchargés n'avaient pas de clé unique, donc une colonne série pk a été générée lorsque j'ai importé dans PostGIS. Il y avait quelques chevauchements dans les ensembles de données et j'ai importé par inadvertance plusieurs enregistrements plusieurs fois lors du développement du script d'importation.
L'instruction group by inclut toutes les colonnes du tableau, à l'exception de la clé primaire.
Il ne supprimera qu'un seul ensemble de lignes en double à chaque exécution, donc si une ligne est répétée 4 fois, vous devrez l'exécuter au moins 3 fois. Ce n'est probablement pas aussi rapide que la solution de John, mais fonctionne dans une table existante. Cela fonctionne également lorsque vous n'avez pas d'ID unique pour chaque géométrie unique (comme l'osm_id dans la question d'origine).
J'ai utilisé un script python pour répéter jusqu'à ce qu'il n'y ait plus de doublons, puis j'ai exécuté un vide complet. Je pense que le script et le vide ont pris chacun environ 30 minutes pour quelques centaines de milliers de doublons provenant d'environ 1,5 million d'enregistrements dans 6 tableaux. Beaucoup de bien pour une seule fois. Il a parcouru les petites tables très rapidement.
EDIT: SQL modifié pour éviter de s'exécuter plusieurs fois sur la base de la suggestion de @dbaston (ci-dessous). J'ai essayé cette méthode de requête sur une grande table (~ 1,5 million d'enregistrements, ~ 25 000 lignes de points en double), et après qu'elle ait fonctionné pendant 45 minutes, j'ai annulé son exécution. L'exécution avec le SQL ci-dessus (en utilisant une sous-requête plus petite de HAVING COUNT) a réduit chaque exécution à moins de 30 secondes. Après avoir exécuté 3 fois, cela a été fait avec tous les doublons. Le SQL ci-dessous devrait être OK pour les petites tables.
la source
ctid
colonne toujours disponible (voir les documents ).primary_key NOT IN (SELECT max(primary_key) ....
Une réponse plus générale pour supprimer facilement les doublons de géométrie dans la table PostGIS. La commande suivante supprime toutes les entités avec une géométrie en double dans "nom_table" en fonction de la clé primaire (colonne "gid") et de l'égalité de la géométrie (colonne "geom"). Sachez que cela supprime vraiment tous les doublons de géométrie, ils seront partis pour toujours! Peut-être sauvegarder en premier?
la source