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

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

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

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

阅读 6.2k
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(变换流),可以处理这种超大的文件。

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

新手上路,请多包涵

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进