TypeORM使用ST_GeomFromGeoJSON插入Geometry类型

时间:2020-09-09 22:44:07

标签: postgresql nestjs typeorm

我有一个使用Geometry列类型的postgres表。

这是我的桌子:

CREATE TABLE areas (
    id SERIAL PRIMARY KEY,
    name VARCHAR(64),
    polygon GEOMETRY
);

而且,通常我会插入如下数据:

INSERT INTO areas (name, polygon) VALUES (
    'A',
    ST_GeometryFromText('POLYGON ((-123.11386585235593 49.284015800344065, 
                        -123.11882257461549 49.28074038150665, 
                        -123.11337232589727 49.27721276406796, 
                        -123.1078577041626 49.281104327676616, 
                        -123.10996055603025 49.28152426222755, 
                        -123.11386585235593 49.284015800344065))'));

如果我从postgres运行该语句,则当前工作正常。

但是在我的NestJS / TypeORM实体中,我已定义:

@Column('geometry', {nullable: true, name: 'polygon ' }
@ApiProperty()
polygon : string;

一旦我给值赋了:

areas .p​​olygon ='POLYGON((--123.11386585235593 49.284015800344065, -123.11882257461549 49.28074038150665, -123.11337232589727 49.27721276406796, -123.1078577041626 49.281104327676616, -123.10996055603025 49.28152426222755, -123.11386585235593 49.284015800344065))';

我收到此错误:

错误:错误:未知的GeoJSON类型 在Parser.parseErrorMessage(C:\ Users \ myuserpath \ myproject \ node_modules \ pg-protocol \ dist \ parser.js:278:15)

但是我注意到原始查询是:

INSERT INTO "areas VALUES ('A', ST_GeomFromGeoJSON('POLYGON ((-123.11386585235593 49.284015800344065, 
                            -123.11882257461549 49.28074038150665, 
                            -123.11337232589727 49.27721276406796, 
                            -123.1078577041626 49.281104327676616, 
                            -123.10996055603025 49.28152426222755, 
                            -123.11386585235593 49.284015800344065)))'::geometry)

我不确定该列在何处定义了ST_GeomFromGeoJSON 如何使用TypeORM插入该多边形?

2 个答案:

答案 0 :(得分:2)

经过长时间的研究,我找到了一种方法。 还有另一种执行插入的方法:

const myPolygon = [[-123.11882257461549 49.28074038150665],[...],[...],[...]]

    const areas = await getConnection()
          .createQueryBuilder()
          .insert()
          .into(Areas) //HERE YOUR TABLE NAME
          .values({
            name: 'MrMins',
            columnX: 'lorem ipsum', //LIST OF YOUR COLUMNS
            active: true, //LIST OF YOUR COLUMNS
            polygon: () =>
              `ST_GeomFromGeoJSON( '{ "type": "Polygon", "coordinates": [${myPolygon}] }' )`,
          })
          .execute();

该实体在问题中被声明为。但是这种执行Insert的方法可以使用任何需要的功能:ST_GeometryFromText,甚至可以使用POINT

答案 1 :(得分:0)

我发现只是将实体的列注释如下,并在解析器上使用标准突变:

   @Column({
        type: 'geometry',
        spatialFeatureType: 'LineString',
        srid: 4326,
    })

与使用 querybuilder 相比,我更喜欢这种方法,当您查询时,您的数据已经格式化为几何体的文本/JSON 形式。