如何修复混合lat / lng命令

时间:2013-03-07 11:37:57

标签: postgresql map postgis openstreetmap

我有一些用osm2pgsql导入的OSM数据:

osm2pgsql -d geomdb -l -U DBUSER -H DBHOST -S my.style germany.shp

默认的srid是4326:

GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]

也是由openstreetmap,mapquest,google使用的(我已经在某处读过)。 现在,我的数据库中的几何图形看起来像(例如)

LINESTRING(10.02 54.34,10.01 54.33,10.03 54.38)

而不是:

LINESTRING(54.34 10.02,54.33 10.01,54.38 10.03)

切换每个点的lat / lng值。为什么?我可以在不重新导入数据的情况下修复此问题吗?

我不希望在每个查询之前/之后在我的应用程序中执行此操作。

2 个答案:

答案 0 :(得分:3)

使用函数ST_FlipCoordinates将YX交换为XY轴顺序。

答案 1 :(得分:1)

当然可以这样做,你必须将线串制成单独的点,然后通过切换X和Y来创建一个新点,再次创建一个线串然后用新的线串替换线串。像这样,只需用你的名字替换名字。

UPDATE the_table AS t
SET the_linestring=l.the_linestring
FROM
  (SELECT id,
          st_makeline(point) AS the_linestring
   FROM
     ( SELECT t.id,
              st_makepoint(st_y(st_pointn(the_linestring,buz)) ,st_x(st_pointn(the_linestring,index_num))) AS point
      FROM the_table t
      JOIN
        (SELECT id,
                generate_series(1,st_npoints(the_linestring)) AS index_num
         FROM the_table) AS q ON t.id=q.id ) AS q
   GROUP BY q.id ) AS l
WHERE t.id=l.id;