2010-03-26 5 views
31

Ich versuche, eine Reihe von Breiten-/Längengradpaaren in einen PostGIS-Geographie-Typ zu laden, um nach Standort abfragen zu können.Wie konvertiere ich ein Breiten-/Längengrad-Paar in einen PostGIS-Geographie-Typ?

Insbesondere habe ich eine Tabelle mit Float Breite und Länge Spalten und eine geography(Point, 4326) Spalte. Ich würde

update mytable set geography = ??? 

Die Dokumentation erscheint vorschlagen zu tun, dass die folgenden sollte funktionieren:

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

nicht. Ich weiß nicht, was es diesen Punkt als Bedeutung interpretiert, aber es lässt nur den Längengrad zwischen -90 und 90 liegen, also ist es eindeutig keine Länge.

Also, was mache ich?

+1

E-Mail die Liste oder gehen Sie auf irc.freenode.net #postgis – dassouki

+0

Ich bin in #postgis. Es ist totenstill. Mailing der Liste ist meine nächste Anlaufstelle. – DRMacIver

Antwort

36

... seufzen. Dummheit meinerseits. Anscheinend ist die richtige Reihenfolge Länge, Breite. Ich wurde getäuscht, weil ich dachte, dass beide Koordinaten die gleiche Reichweite hätten (-180 bis 180), also dachte ich, dass etwas Subtileres vor sich ging.

+7

Längengrad, Breitengrad Sortierung führt zu vielen Fehlern. – kbrock

+0

Dies ist immer noch eine schreckliche Antwort, und Sie sollten den Ratschlag von @MikeT mit ST_MakePoint anstelle von String-Verkettung akzeptiert haben, die Rundungsfehler einführt. –

+2

Sie meinen die drei und vier Jahre nachdem ich die Frage gepostet habe und lange nachdem ich das Problem nicht mehr hatte? – DRMacIver

5

Um den Austausch zwischen lat und lng führen Sie verwenden:

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

mit oder ohne srid.

+0

Diese Methode wird einige verlustbehaftete Rundungsfehler haben (d. H. 'Float8' →' text' → 'float8'). Außerdem funktioniert 'ST_X' nur bei' POINT' Geometrietypen. –

7

Hier sind einige Möglichkeiten, Geographie Typen zu machen:

  1. numerische Rechnen long und lat Spalten zu einem geog Geographie Typ:

    UPDATE mytable SET geog = ST_SetSRID(ST_MakePoint(long, lat), 4326)::geography 
    
  2. Wandeln geom Geometriespalte (SRID=4326) auf einem geog geography type mit einem einfachen Cast:

    UPDATE mytable SET geog = geom::geography 
    
  3. Verwandeln eine projizierten geom Geometrie Spalte zu einem geog Geographie Typ:

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

Hinweis, dass die letzten beiden Beispiele auf jedem Geometrietyp arbeiten. Auch die Konvertierung von Geometrie zu Geographie ist oft implizit, und diese Beispiele funktionieren ohne ::geography, jedoch sind explizite Umwandlungen normalerweise eine gute Übung für diese Dinge.