pg-promise将多边形错误插入PostGIS数据库。

4

我正在使用pg-promise将多个geojson MultiPolygons插入到postgis数据库中。插入到数据库的操作正常,但对于其中一些行,我遇到了奇怪的行为,即该单元格填充了两行。第一行是一些加载信息,第二行是实际的geom对象,更奇怪的是,它从geojson转换为postgis geom。

function createBorder(pathToJSON, table) {
  fs.readFile(pathToJSON,
    {encoding: 'UTF-8'},
    (err, data) => {

    let geoJSON = JSON.parse(data);
    geoJSON.features.forEach(f => {
      f.geometry.crs = {
        type: 'name',
        properties: {
          name: 'EPSG:4326'
        }
      }
      db.none('INSERT INTO nyc_borders(geom)\
        VALUES (ST_GeomFromGeoJSON(${geoJSON}))', {
        geoJSON: f.geometry
      })
      .then((d) => {
        console.log(f.geometry);
      })
      .catch(error => {
        console.log("ERROR: ", error);
      })
    });
  });
}
createBorder('./data/community_districts.geojson');

我简化了geoJSON的输出,基本上是从opendata门户下载的纽约市社区地区边界。

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "shape_leng": "51549.5578986",
        "boro_cd": "311",
        "shape_area": "103177785.347"
      },
      "geometry": {
        "type": "MultiPolygon",
        "coordinates": [
          [
            [
              [
                -73.97348373564797,
                40.61137106069874
              ],
              [
                -73.97303089190211,
                40.6090051063008
              ],
              [
                -73.97299433938896,
                40.60881414180224
              ]
            ]
          ]
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "shape_leng": "65821.875617",
        "boro_cd": "313",
        "shape_area": "88195686.2688"
      },
      "geometry": {
        "type": "MultiPolygon",
        "coordinates": [
          [
            [
              [
                -73.96720294103956,
                40.573326317397424
              ],
              [
                -73.96738975478877,
                40.573258999904446
              ],
              [
                -73.9674356779313,
                40.57320896967127
              ],
              [
                -73.96736390080571,
                40.57304456895217
              ],
              [
                -73.98372152615246,
                40.59582107821707
              ]
            ]
          ]
        ]
      }
    }
  ]
}

我的数据库中有一些图片:

数据库表格,其中每行有一个单元格内含两个行

展开一个单元格以更好地查看实际的两行

我真的卡在这里了,因为我不知道如何开始调试,因为插入操作似乎确实有效,转换geojson对象也看起来很好。我实际上无法弄清楚是谁导致了这种错误的行为。

2个回答

1
你可以使用自定义类型格式,完全控制pg-promise如何格式化数据。
例如,如果你有一个array[][2](如图所示的点),你可以按照以下方式进行转换:
const toGeometry = g => ({ /* g = array[][2] (points) */
    rawType: true,
    toPostgres: a => {
        const points = a.map(p => pgp.as.format('$1 $2', p));
        return 'ST_GeomFromText(\'LINESTRING(' + points.join() + ')\')';
    }
});

然后您可以传入toGeometry(f.geometry)来应用您的自定义格式。

另请参阅:ST_GeomFromText


0

我找到了解决我的问题的方法,图片中显示的两行只是Datagrip添加的信息,告诉我巨大的多边形没有完全加载。

我用psql查看了相同的行:

SELECT ST_ASGEOJSON(geom) FROM <tablename> WHERE id=<myid>

然后第二行就不会显示出来了。 然后我意识到这只是额外的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接