2010-03-26 1 views
31

J'essaye de charger un tas de paires de latitude/longitude dans un type de géographie de PostGIS de manière à pouvoir interroger par emplacement.Comment convertir une paire latitude/longitude en type de géographie PostGIS?

En particulier, j'ai une table avec des colonnes de latitude et de longitude flottantes et une colonne geography(Point, 4326). Je voudrais faire

update mytable set geography = ??? 

La documentation semble suggérer que les éléments suivants devraient fonctionner:

update mytable set geography = ST_GeogFromText('POINT(' || latitude || ' ' || 
                  longitude || ')'); 

Il ne fonctionne pas. Je ne sais pas ce que signifie interpréter ce point comme signifiant, mais cela permet seulement à la longitude de se situer entre -90 et 90, donc ce n'est clairement pas une longitude.

Alors, qu'est-ce que je fais?

+1

envoyer la liste ou continuer sur irc.freenode.net #postgis – dassouki

+0

Je suis dans #postgis. C'est complètement silencieux. L'envoi de la liste est mon prochain port d'escale. – DRMacIver

Répondre

36

... soupir. Stupidité de ma part. Apparemment, l'ordre correct est la longitude, la latitude. J'ai été trompé en pensant que les deux coordonnées avaient la même gamme (-180 à 180) alors je pensais que quelque chose de plus subtil se passait.

+7

la longitude, la latitude de la commande, bien sûr, introduit beaucoup de bugs. – kbrock

+0

C'est toujours une réponse horrible, et vous devriez avoir accepté le conseil de @MikeT avec ST_MakePoint au lieu de la concaténation de chaîne qui introduit des erreurs d'arrondi. –

+2

Vous voulez dire ceux faits trois et quatre ans après que j'ai posté la question et longtemps après je n'ai plus eu le problème? – DRMacIver

5

Pour effectuer l'échange entre lat et lng vous pouvez utiliser:

update mytable set geography = ST_GeographyFromText('SRID=4326;POINT(' || st_x(geom) || ' ' || st_y(geom) || ')'); 

avec ou sans srid.

+0

Cette méthode aura quelques erreurs d'arrondi avec perte (par exemple, 'float8' →' text' → 'float8'). De même, 'ST_X' ne fonctionne que sur les types de géométrie' POINT'. –

7

Voici quelques façons de faire les types de géographie:

  1. Convertir les colonnes numériques long et lat à un type de géographie geog:

    UPDATE mytable SET geog = ST_SetSRID(ST_MakePoint(long, lat), 4326)::geography 
    
  2. Convertir une colonne géométrique geom (SRID=4326) à un geog type de géographie utilisant une simple fonte:

    UPDATE mytable SET geog = geom::geography 
    
  3. transformer une colonne géométrique geom projetée à un type de géographie geog:

    UPDATE mytable SET geog = ST_Transform(geom, 4326)::geography 
    

Notez que les deux derniers exemples fonctionnent sur tout type de géométrie. En outre, la conversion de la géométrie à la géographie est souvent implicite, et ces exemples fonctionnent sans ::geography, mais les conversions explicites sont généralement une bonne pratique pour ces choses.

Questions connexes