【问题标题】:Transfer polygons coordination to a format which PostgreSQL can understand将多边形坐标转换为 PostgreSQL 可以理解的格式
【发布时间】:2019-12-04 20:40:02
【问题描述】:

我正在将 Django 与 PostGIS 一起使用,并尝试在我的 Postgres SQL 中导入一些数据。我的数据库中有一个 geometry(Polygon, 4326) 列:

poly            | geometry(Polygon,4326) | not null

现在我想将一些 CSV 数据导入我的数据库: 这是我的数据:

poly, district_number
"((51.356568, 35.765461), (51.356589, 35.765382), (51.356461, 35.76536), (51.356441, 35.765429), (51.356436, 35.765446), (51.356408, 35.765561), (51.356537, 35.765582), (51.356566, 35.76547), (51.356568, 35.765461))", 2
"((51.356568, 35.765461), (51.356589, 35.765382), (51.356461, 35.76536), (51.356441, 35.765429), (51.356436, 35.765446), (51.356408, 35.765561), (51.356537, 35.765582), (51.356566, 35.76547), (51.356568, 35.765461))", 3
....

我正在使用这个命令:

COPY get_house_info_house(poly, district_number)
FROM '/tmp/data.csv' DELIMITER ',' CSV HEADER;

我得到这个错误:

ERROR:  parse error - invalid geometry
HINT:  "((" <-- parse error at position 2 within geometry
CONTEXT:  COPY get_house_info_house, line 2, column poly: " 
((51.356568, 35.765461), (51.356589, 35.765382), (51.356461, 
35.76536), (51.356441, 35.765429), (51...."

我认为 Postgres 无法识别多列格式。我可以将我的数据转换为任何格式,例如 GeoJson 或任何其他格式,但问题是如何将其转换为 Postgres 可以理解的格式。

在类似的问题中,我找到了“ST_GeomFromGeoJSON”,但我不知道如何在 CSV 导入中使用它。

【问题讨论】:

    标签: database postgresql csv import postgis


    【解决方案1】:

    在 COPY 数据中,您可以使用 EWKT 格式的几何值,并以 SRID 开头。

    示例(逐字记录;在 CSV 文件的上下文中,该字段将用双引号括起来):

    SRID=4326;POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239,-71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))
    

    请参阅https://postgis.net/docs/UpdateGeometrySRID.htmlPostGIS COPY geometry with SRID? 了解更多信息。

    【讨论】:

      【解决方案2】:

      您收到此错误是因为您将输入视为 CSV,因此多边形数据中的逗号被视为行的分隔符,因此接收的值过多。应引用此类数据。对于多边形值,您还应该使用圆括号而不是方括号。

      此外,COPY 命令的数据顺序错误。在COPY 命令中交换district_numberpoly

      您的数据需要转换为如下所示:

      poly, district_number
      "((51.356568, 35.765461), (51.356589, 35.765382), (51.356568, 35.765461))", 2
      "((53.365689, 35.765461), (51.356589, 35.765382), (53.355689, 35.765461))", 3
      

      披露:我是 EnterpriseDB (EDB) 员工。

      【讨论】:

      • 我对引号感到抱歉。我的 CSV 文件中已经有引号,我只是忘了在我的问题中写下它。关于[]。我用 () 替换了所有 [] ,我仍然得到同样的错误。我也更新了我的问题。
      • 我还注意到您需要在 COPY 命令中交换 District_number 和 poly,因为您的数据在文件中没有按该顺序显示。我已经用这个建议更新了我的答案。
      • 是的,你是对的。我之前的错误是因为 poly 和 District_number 的顺序。现在我得到了多边形格式的错误
      • 您的数据是否完全符合我在回答中给出的示例格式?我得到以下内容,其中 data.csv 包含我之前示例中所示的数据:postgres=# CREATE TABLE get_house_info_house (district_number int, poly polygon); CREATE TABLE postgres=# COPY get_house_info_house(poly, district_number) postgres-# FROM 'C:\Temp\data.csv' DELIMITER ',' CSV HEADER; COPY 2
      • 它不起作用,因为您使用的是polygon类型,而OP有geometry(polygon),这是一种完全不同的存储格式
      猜你喜欢
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 2021-09-02
      相关资源
      最近更新 更多