Sélectionnez tous les points dans un cadre de sélection

11

J'ai déjà vu cette question posée, mais les réponses que j'essaie ne fonctionnent pas.

Je cherche à interroger toutes les voies OSM qui se trouvent dans une zone de délimitation. Les données OSM ont été importées avec mercator sphérique par défaut. J'interroge en utilisant LAT / LON d'où la transformation

SELECT *
FROM planet_osm_ways
WHERE ST_Transform(
  ST_MakeEnvelope(37.808264, 37.804339, -122.275244, -122.271189, 
  4326),3857
);

Lorsque j'exécute cela, j'obtiens l'erreur suivante:

ERREUR: l'argument de WHERE doit être de type booléen, pas de type geometry LINE 3: WHERE ST_Transform (ST_MakeEnvelope (37.808264, 37.804339, -12 ...

theeartofbeing
la source
1
Donnez un lien vers les anciennes questions que vous avez lues et utilisées pour construire votre requête.
user30184
Votre ordre de coordonnées dans ST_MakeEnvelope () ne semble pas avoir ce format, xmin, ymin, xmax, ymax
artwork21
@ artwork21 J'utilise un lat / long dans ST_MakeEnvelope. Est-ce faux? Dois-je le convertir dans un format différent? Je pensais que c'était ce que faisait
ST_Transform
1
Désolé, j'ai dû relire les bons manuels, y compris le document de schéma wiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways . Planet_osm_ways ne contient pas de géométries et est plutôt inutile pour l'utilisateur final. C'est pour le système. Aucune chance de faire des requêtes de boîte englobante à partir de cette table. Avec des tables comme planet_osm_roads, c'est possible. Planet_osm_roads.geom n'existe toujours pas, car comme vous pouvez le voir sur le schéma, il est nommé planet_osm_roads.way.
user30184
1
Non. J'ai dit que vous ne pouvez pas faire de requête de boîte englobante à partir de planet_osm_ways parce que cette table n'a aucune géométrie. Voir: id, nœuds, balises, en attente - aucun d'entre eux ne contient de géométries. Les tables _line, _point, _polygon et _roads sont OK. Et j'ai essayé de souligner que la colonne de géométrie dans toutes les tables de géométrie est nommée comme "chemin", pas comme "geom" ou quoi que ce soit d'autre.
user30184

Réponses:

14

Vous avez trois problèmes avec votre instruction, bien que le message d'erreur n'indique qu'une partie de celle-ci ... "WHERE doit être de type booléen" signifie que les informations que vous avez fournies à WHERE n'évaluent pas un résultat booléen.

  1. ST_MakeEnvelope demande ses paramètres dans cet ordre: xmin, ymin, xmax, ymax, srid.

    Vous avez mal passé ymax, ymin, xmax, xmin, srid.

  2. O must doit évaluer à booléen:

    Pour déterminer si une géométrie et l'enveloppe ont des éléments en commun, le WHERE doit être construit comme ceci: WHERE geom && envelope_geomsinon vous pouvez utiliser ST_Contains

    Pour déterminer si la géométrie est contenue dans l'enveloppe: `WHERE ST_Contains (enveloppe_geom, geom)

    Vous n'avez fourni aucune méthode de comparaison pour le WHERE.

  3. La table 'planet_osm_ways' ne contient aucune colonne de géométrie, bien que 'planet_osm_roads' contienne une colonne de géométrie nommée 'way'.

    Vous pouvez créer une colonne de géométrie dans le tableau 'planet_osm_ways' à partir des fichiers planet_osm_nodes.lat et planet_osm_nodes.lon associés.

En utilisant 'planet_osm_roads', cela montre comment utiliser une boîte englobante contre une table avec une colonne de géométrie:

SELECT *
FROM planet_osm_roads
WHERE planet_osm_roads.way && ST_Transform(
  ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
  4326),3857
);

ou changez-le en ceci:

SELECT *
FROM planet_osm_roads
WHERE ST_Contains(
    ST_Transform(
        ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
        4326)
        ,3857)
    ,planet_osm_roads.way);
kttii
la source