сохранить пустую многострочную строку в postgis с помощью openlayers

Я пытаюсь сохранить «пустую» функцию с помощью openlayers (версия >= 3), например:

let defaultFeature =  new ol.Feature({
    geometry: new ol.geom.MultiLineString([]),
});

Как видите, это просто пустая многострочная строка, ожидающая заполнения строками.

У меня есть таблица базы данных, построенная следующим образом:

CREATE TABLE md (
   id SERIAL PRIMARY KEY NOT NULL,
   name varchar(40) NOT NULL,
   geometry geometry(MULTILINESTRING, 3857)
);

затем я отправляю функцию в tinyows для хранения (здесь полезная нагрузка)

<Transaction
xmlns="http://www.opengis.net/wfs" service="WFS" version="1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
<Insert>
    <md
        xmlns="http://www.tinyows.org/">
        <geometry>
            <MultiLineString
                xmlns="http://www.opengis.net/gml" srsName="EPSG:3857"/>
            </geometry>
        </md>
    </Insert>
</Transaction>

но база данных выдает ошибку:

Geometry has Z dimension but column does not

После получения этой ошибки я попытался использовать параметр «opt_layout» (http://openlayers.org/en/latest/apidoc/module-ol_geom_MultiLineString-MultiLineString.html) следующим образом:

let defaultMdFeature =  new ol.Feature({
    geometry: new ol.geom.MultiLineString([], 'XY'),
});

и полезная нагрузка:

<Transaction
xmlns="http://www.opengis.net/wfs" service="WFS" version="1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
<Insert>
    <md
        xmlns="http://www.tinyows.org/">
        <geometry>
            <MultiLineString
                xmlns="http://www.opengis.net/gml" srsName="EPSG:3857"/>
            </geometry>
        </md>
    </Insert>
</Transaction>

К сожалению, я получаю ту же ошибку даже при указании макета.

Мой вопрос: есть ли способ сохранить пустую многострочную 2d-строку в postgis?

Спасибо заранее за вашу поддержку,

G.R.


person G. Ribeiro    schedule 03.07.2018    source источник
comment
Можете ли вы проверить в файлах журнала postgresql, какой оператор sql отправляется в базу данных?   -  person Jim Jones    schedule 03.07.2018
comment
Кстати, если это применимо к вашей геометрии, вы пытались использовать geometry geometry(MULTILINESTRINGZ, 3857) вместо geometry geometry(MULTILINESTRING, 3857)?   -  person Jim Jones    schedule 03.07.2018
comment
Привет, Джим, я тоже попробовал geometry(MULTILINESTRINGZ, 3857), но, поскольку я работаю с 2D-строкой, когда я попытался обновить многострочную строку, я получил еще одну ошибку 2018-07-03 14:38:30.501 CEST [17816] ERREUR: Column has Z dimension but geometry does not   -  person G. Ribeiro    schedule 03.07.2018
comment
я не знаю, может ли это помочь, я проверил журналы postgresql и увидел это: 2018-07-03 14:12:25.315 CEST [9372] ERREUR: Geometry has Z dimension but column does not 2018-07-03 14:12:25.315 CEST [9372] INSTRUCTION : INSERT INTO "public"."md" ("id","geometry") VALUES ('1','01050000A0110F000000000000')   -  person G. Ribeiro    schedule 03.07.2018
comment
Ваш код генерирует MULTILINESTRING Z EMPTY, который не соответствует структуре вашей таблицы -> проверьте: select st_astext('01050000A0110F000000000000') as z,st_astext('010500000000000000') as notz   -  person Jim Jones    schedule 03.07.2018
comment
Попробуйте это: <MultiLineString xmlns="http://www.opengis.net/gml" srsName="EPSG:3857" srsDimension="2"/>   -  person Jim Jones    schedule 03.07.2018
comment
я пытался отправить в tinyows эту полезную нагрузку <Transaction xmlns="http://www.opengis.net/wfs" service="WFS" version="1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"> <Insert> <md xmlns="http://www.tinyows.org/"> <geometry> <MultiLineString xmlns="http://www.opengis.net/gml" srsName="EPSG:3857" srsDimension="2"/> </geometry> </md> </Insert> </Transaction> с помощью httprequester и с помощью srsDimension="2"   -  person G. Ribeiro    schedule 03.07.2018
comment
И что на этот раз говорит лог-файл?   -  person Jim Jones    schedule 03.07.2018
comment
я снова получаю ERREUR: Geometry has Z dimension but column does not. Может быть, проблема исходит от tinyows?   -  person G. Ribeiro    schedule 03.07.2018
comment
файл журнала: 2018-07-03 16:39:24.007 CEST [11456] ERREUR: Geometry has Z dimension but column does not 2018-07-03 16:39:24.007 CEST [11456] INSTRUCTION : INSERT INTO "public"."md" ("id","geometry") VALUES ('1','01050000A0110F000000000000') все еще пытается вставить многострочную строку z   -  person G. Ribeiro    schedule 03.07.2018
comment
Это странно. Параметр srsDimension="2" явно указывает, что геометрия имеет только 2 измерения. Проблема может быть в другом. К сожалению, я не знаком с tinyows.   -  person Jim Jones    schedule 03.07.2018
comment
Пример: <gml:MultiSurface srsDimension="2" srsName="urn:x-ogc:def:crs:EPSG:3857">. Единственное, что отличается от вашего XML, это тот факт, что этот использует пространство имен gml:, а вы не   -  person Jim Jones    schedule 03.07.2018
comment
Большое спасибо за вашу помощь, если я когда-нибудь найду решение, я опубликую его здесь.   -  person G. Ribeiro    schedule 03.07.2018
comment
ладно. удачи :)   -  person Jim Jones    schedule 03.07.2018


Ответы (1)


Я пробовал следующее:

// MultiLineString takes an array of array (or the constructor does not receive a valid input)
var defaultMdFeature =  new ol.Feature({
  geometry: new ol.geom.MultiLineString([[]]),
});

var wfs = new ol.format.WFS();

var transaction = wfs.writeTransaction([defaultMdFeature], null, null, {
  featureNS: 'http://www.tinyows.org/',
  featureType: 'md',
  hasZ: false,  // To be sure there are only 2 dimensions
  gmlOptions: {
    srsName: 'EPSG:3857'
  }
})

var s = new XMLSerializer();
var str = s.serializeToString(transaction);

console.log(str);

console.log(str) возвращает следующее:

<Transaction
    xmlns="http://www.opengis.net/wfs" service="WFS" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Insert>
        <md
            xmlns="http://www.tinyows.org/">
            <geometry>
                <MultiLineString
                    xmlns="http://www.opengis.net/gml" srsName="EPSG:3857">
                    <lineStringMember>
                        <LineString srsName="EPSG:3857">
                            <posList srsDimension="2"></posList>
                        </LineString>
                    </lineStringMember>
                </MultiLineString>
            </geometry>
        </md>
    </Insert>
</Transaction>

Вы можете попробовать этот способ, поскольку вы видите, что XML отличается, поскольку тег LineString содержит<posList srsDimension="2"></posList>

person Thomas Gratier    schedule 03.07.2018