pg-promise将多边形错误插入到postgis数据库中

时间:2018-07-01 07:51:30

标签: javascript postgresql gis postgis pg-promise

所以我正在使用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 portal下载的nyc的社区区域边界 Geojson:

{
  "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
              ]
            ]
          ]
        ]
      }
    }
  ]
}

我数据库中的一些图片:

database table with rows that have two lines inside one cell

one cell expanded to see the actual tow lines better

所以我真的很困惑,因为我不知道如何开始调试,插入插入确实可以正常工作,并且geojson对象的转换也很好。我实际上不知道是谁造成了这种错误的行为。

2 个答案:

答案 0 :(得分:1)

通过使用pg-promise,您可以完全控制Custom Type Formatting格式化数据的方式。

例如,如果您有一个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

答案 1 :(得分:0)

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

我用psql查看了相同的行:

public void OnDrag(PointerEventData eventData)
{
    transform.parent.position = (Vector3)eventData.position + offset;
}

,第二行将不会显示。 然后我意识到这只是补充信息。