pg-обещание неправильной вставки мультиполигонов в базу данных postgis - PullRequest
0 голосов
/ 01 июля 2018

Поэтому я использую pg-обещание для вставки нескольких геополитических мультиполигонов в базу данных 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, в основном это границы районов сообщества из nyc, загруженного с портала opendata 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
              ]
            ]
          ]
        ]
      }
    }
  ]
}

Некоторые фотографии из моей базы данных:

таблица базы данных со строками, имеющими две строки в одной ячейке

одна ячейка расширена, чтобы лучше видеть фактические линии буксировки

Так что я действительно застрял, потому что у меня нет идеи, как начать отладку, пока вставка действительно работает, как, а также преобразование объекта geojson выглядит хорошо. Я на самом деле не могу понять, кто вызывает это неправильное поведение.

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Вы можете иметь полный контроль над тем, как pg-prom форматирует данные, используя Форматирование пользовательских типов .

Например, если у вас есть 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 голосов
/ 01 июля 2018

Я нашел решение для моей проблемы - две строки, показанные на рисунках, смутили меня, где только информация добавлена ​​datagrip, чтобы сообщить мне, что огромные полигоны не загружены полностью.

Я посмотрел в те же строки с psql:

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

и там вторая строка не будет отображаться. Тогда я понял, что это просто дополнительная информация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...