【问题标题】:Insert geography/Geometry data type into postgres sql将地理/几何数据类型插入 postgresql
【发布时间】:2021-11-20 05:22:15
【问题描述】:

在 CSV 文件中有数据 解析 CSV 文件以将数据插入 Postgres DB。列数据类型之一是“地理”

数据采用这种形式"0101000020BB100000FCA776FD9E256240F2EBF2AD0F0D43C0"

g = "0101000020BB100000FCA776FD9E256240F2EBF2AD0F0D43C0"

使用ST_GeomFromText(@g).. 插入此数据但会引发此错误

Npgsql.PostgresException:XX000:解析错误 - 无效几何数据: 严重性:错误 InvariantSeverity:错误 SqlState:XX000
MessageText:解析错误 - 无效几何提示:“01” 例程:pg_parser_errhint

代码

insert into testtable values (@s1,@s2,@s3,@s4,@s5,@s6,@s7,@s8,@s9,@s10,@s11,@s12,@s13,@s14,@s15,@s16,@s17,@s18,@s19,@s20,@s21,@s22,@s23,@s24,@s25,@s26,@s27,ST_GeomFromWKB(@s28))

【问题讨论】:

  • 您发布的内容看起来像十六进制形式的二进制,而不是 WKT。文字是MULTIPOINT ((10 40), (40 30), (20 20), (30 10))。您必须先将该十六进制字符串转换为字节,然后使用`ST_GeomFromWKB`。或use NetTopologySuite with NpgSql 将强类型几何值发送到服务器,而不是让服务器解析它们
  • 使用插入语句..用c# Npgsql插入数据
  • 无论如何,请发布您的实际代码和表架构。如果你使用 new NpgsqlCommand("INSERT INTO data (geom) VALUES (@p)", conn)Point 值,你就不会遇到这样的问题。您将无法将COPYST_GeomFromText 一起使用。显然你在做别的事情。
  • 将您的代码添加到问题本身。添加 C# 和 SQL 代码。这里的问题是因为 C# 代码发送的是十六进制字符串而不是字节数组。如果您使用 WKBReader 类,则可以避免解析。它的HexToBytes 会将十六进制字符串转换为byte[],其Read 方法会将byte[] 转换为IGeometry 值,可以直接用作参数
  • @user3676367 你试过@s28::geography吗?另外,您能否添加发送到数据库的INSERT 语句的样子?

标签: c# postgresql postgis


【解决方案1】:

ST_GeomFromText 需要人类可读的文本,例如“POINT(145.1756579701904 -38.10204099999818)”作为其输入。您拥有的文本可以直接插入到几何列中,无需包装功能。任何转换都会自动完成。

【讨论】:

  • 没有包装器,我只得到以下错误“Npgsql.PostgresException:42804:列“location_pt”是地理类型,但表达式是文本类型”
【解决方案2】:

谢谢大家,解决了这个问题,通过转换为几何然后在插入时使用包装函数“ST_GeomFromWKB”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2017-01-05
    • 2013-01-19
    • 1970-01-01
    • 2020-05-19
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多