Closed alisovenko closed 4 years ago
@alisovenko несколько вопросов:
Если грузить GeoJSON и идентифицировать этот объект - то параметр "ID объекта" = 4.
Или "ID объекта" это может не fid... Но в общем с "ID объекта" = 4 в NGW я могу получить данные об объекте (этот полигон OSM_ID = 89383129), а с "ID объекта" = 3 - это уже другой объект в NGW
У нас на id в мобильном строится вся синхронизация. Очень важно, что бы циферки не отличались. Сейчас что в GeoJSON, что в api/resource/
Тут очень темное дело, я не могу понять, что происходит. Дело в том, что WFS-сервер оперирует теми самыми идентификаторами, которые нужны, вот примеры:
<gml:featureMember gml:id="4">
и ниже).При этом, если создать, к примеру, новый объект, то ему будет назначен fid=X. Во всех упоминаниях в обмене сообщениями между QGIS и WFS-серером этот объект будет нумероваться именно как X. Однако, если посмотреть его через инструмент "Определить объекты", то ID объекта не будет равен X.
Подводя итоги: при обмене сообщениями по протоколу WFS все объекты идентифицируются при помощи "настоящих" fid. Но при использовании инструмента "Определить объекты" отображается какой-то внутренний ID объекта (даже понятно какой -- qgis просто нумерует объекты, начиная с 0 и не учитывая fid, и этот номер и будет ID, отображаемый при определении).
Гипотеза: где-то между QGIS и WFS-сервером порвалась цепочка, по которой QGIS забирает идентификатор объекта. Эти идентификаторы не поступают в QGIS, и он выкручивается, как может.
Было бы неплохо, если бы кто-нибудь мог дать:
А может там нумерация с 1, а везде с 0?
@BishopGIS Нет, там дело не в том, что сбилась нумерация 0 и 1. После того, как я повставлял-понаудалял объекты, разность между идентификаторами уже больше одного. Например, если вставить новый объект, то у него идентификатор в БД (fid) будет равен 18 (предыдущие 17 уже были использованы, а поле идентификатора в БД -- serial). При этом ID в QGIS этого объекта будет равно 13 (поскольку всего 14 объектов, и они нумеруются в QGIS: ID=0, ID=1, ... ID=13).
Я думаю, проблема на стороне QGIS. Правда, прямых доказательств не нашел, только косвенные:
Таким образом, я думаю, что QGIS попросту игнорирует эти идентификаторы, а нумерует их по-своему -- начинает с нуля и идет по порядку.
Для того, чтобы проверить предположение, смотрю в исходных кодах QGIS функции, которые отвечают за транзакции. Эти функции должны работать с идентификаторами, которые присутствуют в БД, иначе все операции редактирования пойдут наперекосяк.
Для примера https://github.com/qgis/QGIS/blob/master/src/providers/wfs/qgswfsprovider.cpp#L383 -- функция удаления объектов:
typedef QSet< QgsFeatureId > QgsFeatureIds
. Т.е. это те самые "внутренние" идентификаторы объектов, используемые в QGIS.Если я все правильно разобрал в этом коде, то это не баг NGW, а фишка QGIS. Тем не менее у меня остаются сомнения в том, что я верно интерпретировал эти строки, поскольку я не знаком с C++. @BishopGIS, не мог бы ты проверить ход рассуждений и прокомментировать его?
@alexbruy тоже глянь плиз
Дим, твои исследования верны. В слое хранится маппинг реальных ид (с сервера) с виртуальными кугисовскими: https://github.com/qgis/QGIS/blob/master/src/providers/wfs/qgswfsprovider.h#L187 Проблема в том, что снаружи к этому маппингу нет доступа :(
@alexbruy нам нужна твоя помощь. Можешь ли ты добавить метод возврата реального ид по виртуальному?
Видимо это можно закрывать, похожее поведение мы наблюдаем и с новым WFS сервером в NGW. Видимо ноги мэппинга растут из того, что идентификаторы объекта в WFS - не число, а строка в общем случае. Но вроде бы это не приводит к проблемам.
В ngw: слой - RU-KLU-OBNINSK (http://demo.nextgis.ru/ngw/resource/1316) карта - RU-KLU-MAP (http://demo.nextgis.ru/ngw/resource/1309) объект c fid=4 (большой полигон в центре) имеет фото 3 шт. (например, http://demo.nextgis.ru/ngw/layer/1316/feature/4/photo/4)
Загружаю слой в ngq как geojson - все ОК. Тот же объект (большой полигон в центре) имеет fid 4.
Проблема: Загружаю слой в ngq через WFS (http://demo.nextgis.ru/ngw/resource/1311) - fid не соответствует. Тот же объект (большой полигон в центре) имеет fid 3.