怎样使用copy将形如‘POINT(0 0)’的geography类型数据导入postgresql数据库

现在正打算将一批约10G的包含经纬度的数据导入数据库,由于数据量过大,传统的insert耗时过长,打算采用copy的方法将数据导入。但是对于geography类型的数据必须处理成形如0101000020E6100000D97A8670CC5E5E40967B8159A13C3F40 的数据才能导入,而原数据则是经度和纬度信息。

所以上来寻求帮助,不知道有没有办法在导入的时候让数据库使用st_geomfromtext之类的方法,识别出geography,或者说有什么别的解决方式

还请各位路过的高手们解惑~

阅读 3.3k
评论
    3 个回答

    不知道解决了没,好久没到postgis版块来看了,说说我的方案吧!

    WKT AND EWKT

    • 其实很简单,利用WKT(well-know text)就可以了, 如果数据库里面有一个location字段是geography类型,那么下面两条sql都可以,效果一样。

    insert into test(id, location) values(1, ST_GeographyFromText('SRID=4326;POINT(41.338055 -75.724166)'))
    
    insert into test(id, location) values(2, 'SRID=4326;POINT(41.338055 -75.724166)')

    所以咯,知道该怎么做了哈!!!Postgis支持EWKT(Extended Well-Known Text)

    文件数据变换

    • 原文件的结构(csv)

    id lat lng other properties
    1 12.34 59.43 xxxxx
    2 44.23 139.23 xxxxx
    ... ... ... ...

    变换成如下样式

    id geo other properties
    1 SRID=4326;POINT(59.43 12.34) xxxxx
    2 SRID=4326;POINT(139.23 44.23) xxxxx
    ... ... ...
    • 其实就是SRID=4326;POINT(lng lat),然后就可以愉快的使用COPY命令吧!

    友情提醒:你的数据文件很大,可别千万一次性读到内存里面(当然如果你内存有那么大你就忽略这条好了),有一种东西叫Transform Stream(变换流),可以处理这种超大的文件。

      • 158

      给个建议就是先在mysql里将point转成经纬decimal,通过数据抽取方式抽到pg里之后再转回来。

        • 2
        • 新人请关照

        我也需要这样的方法,同求

          撰写回答

          登录后参与交流、获取后续更新提醒

          相似问题
          推荐文章