Страница 2 из 4

Re: Конвертация векторного слоя из MapInfo в Qgis с сохранением раскраски полигонов

Добавлено: 01 мар 2018, 12:19
wwwisaev
Я так понимаю , закраска зависит от значений атрибутивной таблицы слоя и нужно связать значения с цветом?

Re: Конвертация векторного слоя из MapInfo в Qgis с сохранением раскраски полигонов

Добавлено: 01 мар 2018, 12:22
wwwisaev
Я так понимаю, закраска будет зависеть от данных атрибутивной таблицы, нужно связать нужный цвет с данными полей?

Re: Конвертация векторного слоя из MapInfo в Qgis с сохранением раскраски полигонов

Добавлено: 01 мар 2018, 12:52
Denis Rykov
Да, нужно связать, поэтому сначала я и предложил вам выгрузить стиль из tab в отдельное поле шейпа.

Re: Конвертация векторного слоя из MapInfo в Qgis с сохранением раскраски полигонов

Добавлено: 01 мар 2018, 12:58
wwwisaev
почему то не появилось новое поле, какие были поля, такие и остались

Re: Конвертация векторного слоя из MapInfo в Qgis с сохранением раскраски полигонов

Добавлено: 01 мар 2018, 13:01
wwwisaev
нужно получается сделать закраску по двум полям- порода и группа

Re: Конвертация векторного слоя из MapInfo в Qgis с сохранением раскраски полигонов

Добавлено: 01 мар 2018, 13:31
freeExec
И окажется, что сделать это заново в qgis было бы быстрее.

Re: Конвертация векторного слоя из MapInfo в Qgis с сохранением раскраски полигонов

Добавлено: 01 мар 2018, 13:32
Игорь Белов
Если MapInfo доступна, то перенос цвета делается просто.
  1. В MapInfo добавим колонку текстового типа. Пусть это будет "info3".
  2. Обновим колонку выражением "ObjectInfo(obj,3)". Для полигонов получатся значения вида "Brush (2, 13421823, 16777215)". Второе число и есть цвет заливки.
  3. Преобразуем TAB в шейп любым способом (Universal Translator, FME, GDAL, просто открыть в QGIS и пересохранить в шейп…).
  4. В QGIS в калькуляторе полей создадим поле текстового типа для цвета заливки. Его надо будет заполнить преобразованными значениями второго числа. Так,"13421823" должно превратиться, скажем, в "204,204,255" или "#ccccff".
  5. В настройках стиля справа от выбора цвета заливки жмём кнопочку и выбираем в пункте "Field type: string" имя нового поля.
img_20180301_131359.png
img_20180301_131359.png (2.49 КБ) 8337 просмотров
Действия в предпоследнем пункте несложные: сначала вытащить второе число из "info3", потом преобразовать в строку RGB. Но всё же приятнее заменить ручные операции пользовательской функцией. Вот вам функция brush2fill:

Код: Выделить всё

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from qgis.core import *
from qgis.gui import *

@qgsfunction(args='auto', group='Custom')
def brush2fill(brush, feature, parent):
	color = int(brush.split(', ')[1])
	return u'#{:06x}'.format(color)
В калькуляторе полей пишем формулу: brush2fill( "info3" ).

Аналогично можно перенести свойства обводки (толщину, цвет).

Re: Конвертация векторного слоя из MapInfo в Qgis с сохранением раскраски полигонов

Добавлено: 01 мар 2018, 13:41
freeExec
У такого способа есть пару минусов:
1) Чтобы сменить цвет придётся дергать данные и менять в них старые значения на новые, да ещё писать обратный преобразователь fill2brush
2) После добавления новых объектов им нужно задавать цвета, а значит нужна ещё одна функция params2brush
3) Если потом кто-то поменяет независимо цвета в исходном tab, то будет просто "смерть", т.к. в худшем случае придётся проделывать пункты 1 и 2 ещё раз.

Т.е. весь этот подход годиться только если нужно разово засунуть в QGIS и забыть это как страшны сон.

Re: Конвертация векторного слоя из MapInfo в Qgis с сохранением раскраски полигонов

Добавлено: 01 мар 2018, 13:57
Denis Rykov
Я ведь предложил всё то же самое, только без использования MapInfo:

Код: Выделить всё

$ ogr2ogr -f "ESRI Shapefile" -sql "select *, OGR_STYLE from EXTRACT_POLYGON" EXTRACT_POLYGON.shp EXTRACT_POLYGON.tab

$ ogrinfo -al -geom=NO EXTRACT_POLYGON.shp
INFO: Open of `EXTRACT_POLYGON.shp'
      using driver `ESRI Shapefile' successful.

Layer name: EXTRACT_POLYGON
Metadata:
  DBF_DATE_LAST_UPDATE=2018-03-01
Geometry: Polygon
Feature Count: 1
Extent: (2470584.152000, 2583348.628000) - (2486538.445000, 2604102.155000)
Layer SRS WKT:
...
blank: String (1.0)
OGR_STYLE: String (111.0)
OGRFeature(EXTRACT_POLYGON):0
  blank (String) = (null)
  OGR_STYLE (String) = BRUSH(fc:#000000,bc:#ffffff,id:"mapinfo-brush-1,ogr-brush-1");PEN(w:1px,c:#000000,id:"mapinfo-pen-2,ogr-pen-0")
Кстати, MapServer понимает символику в таком виде. Поэтому слой с таким полем может быть загружен, например, в NextGIS Web и отрисован в с помощью MapServer рендерера без ручной настройки цветов. Проверяли - работает.

Re: Конвертация векторного слоя из MapInfo в Qgis с сохранением раскраски полигонов

Добавлено: 01 мар 2018, 14:19
wwwisaev
Спасибо, все получилось, есть еще вопрос: после закрытия и сохранения проекта, когда открываю заново все красится в черный цвет и в атрибутивной таблице в том поле где был цвет пусто, это каждый раз нужно делать эти операции? И возможно ли открыть этот проект в некстГис мобайл, с сохранением цветов, либо сконвертировать в какой нибудь формат, важна раскраска?

Re: Конвертация векторного слоя из MapInfo в Qgis с сохранением раскраски полигонов

Добавлено: 01 мар 2018, 14:26
wwwisaev
После выполнения запроса, как вы предложили для Qgis, ничего не меняется почему то в атрибутивной таблице

Re: Конвертация векторного слоя из MapInfo в Qgis с сохранением раскраски полигонов

Добавлено: 01 мар 2018, 14:31
Игорь Белов
Настраиваете стиль отображения слоя. В диалоге свойств внизу слева есть кнопочка [Стиль]. Жмёте и выбираете [Сохранить стиль] → [QGIS Layer Style File]. Сохраняете файл в ту же папку и с тем же именем (у него будет расширение QML). Впредь QGIS будет открывать слой с нужными настройками отображения.

Re: Конвертация векторного слоя из MapInfo в Qgis с сохранением раскраски полигонов

Добавлено: 01 мар 2018, 15:07
Denis Rykov
wwwisaev писал(а):
01 мар 2018, 14:26
После выполнения запроса, как вы предложили для Qgis, ничего не меняется почему то в атрибутивной таблице
Потому что в моём примере создаётся новый файл, вот в нём и появляется новое поле.

Re: Конвертация векторного слоя из MapInfo в Qgis с сохранением раскраски полигонов

Добавлено: 02 мар 2018, 09:56
wwwisaev
Проверьте пожалуйста, по моему все так, но выходит ошибка, а через раз выполняется алгоритм, но новый shp так и не создается

Re: Конвертация векторного слоя из MapInfo в Qgis с сохранением раскраски полигонов

Добавлено: 02 мар 2018, 10:08
Denis Rykov
Я выполнял команду из консоли (не из QGIS). Но если вам так удобнее, то пожалуйста: