我有一个表,其中有一个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"
的格式?
1条答案
按热度按时间izkcnapc1#
TypeORM不支持WKT作为PostgreSQL/PostGIS的传输格式;本机驱动程序强制执行GeoJSON格式(请注意,
ST_GeomFromGeoJSON
仅支持解析GeoJSON Features的单个geometry
成员)。不依赖于DTO repository Map,您可以使用
QueryStringBuilder
并直接影响INSERT
SQL语句中的参数处理:如果你所做的只是插入,你可能可以将实体的列类型声明为
string
- PostGIS为它的GEOMETRY
类型定义了隐式字符串转换,并且应该正确地处理导入。SRID=4326
部分是WKT类型(EWKT)的PostGIS特定扩展,它没有CRS的概念-相应的I/O函数分别是ST_GeomFromEWKT
和ST_AsEWKT
。上面提到的自动投射也可以处理EWKT。