postgresql 如何使用typeorm将WKT保存到具有几何数据类型的postgres列?

kfgdxczn  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(238)

我有一个表,其中有一个geom列,其数据类型为geometry。我需要将数据保存到这个表中,并且发送的请求具有该列的wkt类型。当前,表中的一些现有行的数据格式如下:

SRID=4326;POLYGON((-82.42186119969756 35.50904833429925,-82.41310709710558 35.5138338218795,-82.40448173131567 35.50461189763692,-82.41851404282427 35.500629375676766,-82.42186119969756 35.509013402684445,-82.42186119969756 35.50904833429925))

数据的“SRID=4326”部分是否自动生成?
目前我有以下设置:
dto:

@IsString()
 geom: string; //geometry

实体:

@Column('geometry', {spatialFeatureType: 'Polygon', srid: 4326 })
geom: string;

然后我插入数据,像这样,用dto.geom作为wtk字符串:

create(dto: CreatePlaceDto): Promise<number> {        
    return <any>this.repository
      .insert(dto)
      .then((data) => data.identifiers[0][Object.keys(data.identifiers[0])[0]])
      .catch((err) => {
        console.error(err);
      });
  }

当我发送一个请求时,我得到了QueryFailedError: unknown GeoJSON type错误。当从日志中检查原始SQL查询时,看起来wkt得到了一组额外的引号。typeorm正在尝试将geojson从转换为geom。我想我需要typeorm来使用ST_GeomFromText对吗?因为wkt不是geojson。

INSERT INTO "place"("customerId", "geom", "industry", "createdAt", "updatedAt") 
VALUES ($1, ST_SetSRID(ST_GeomFromGeoJSON($2), 4326)::geometry, DEFAULT, DEFAULT) 
RETURNING "placeId", "createdAt", "updatedAt" 
-- PARAMETERS: [13,"\"POLYGON ((-82.42186119969756 35.50904833429925, -82.41310709710558 35.5138338218795, -82.40448173131567 35.50461189763692, -82.41851404282427 35.500629375676766, -82.42186119969756 35.509013402684445, -82.42186119969756 35.50904833429925))\"","industry1"]

我在dto和entity中将geom作为字符串输入是正确的吗?如何获得"SRID=4326;POLYGON((-8 etc etc"的格式?

izkcnapc

izkcnapc1#

TypeORM不支持WKT作为PostgreSQL/PostGIS的传输格式;本机驱动程序强制执行GeoJSON格式(请注意,ST_GeomFromGeoJSON仅支持解析GeoJSON Features的单个geometry成员)。
不依赖于DTO repository Map,您可以使用QueryStringBuilder并直接影响INSERT SQL语句中的参数处理:

await dataSource
  .createQueryBuilder()
  .insert()
  .into(<Entity>)
  .values({
    <columns>: <values>,
    geom: () =>
      `ST_GeomFromText('${<WKT_string>}', 4326)`,
      // or `'SRID=4326;${<WKT_string>}'`,
  })
  .execute()

如果你所做的只是插入,你可能可以将实体的列类型声明为string- PostGIS为它的GEOMETRY类型定义了隐式字符串转换,并且应该正确地处理导入。
SRID=4326部分是WKT类型(EWKT)的PostGIS特定扩展,它没有CRS的概念-相应的I/O函数分别是ST_GeomFromEWKTST_AsEWKT。上面提到的自动投射也可以处理EWKT。

相关问题