Изменение кодировки DBF

Вопросы по нескольким пакетам сразу, или вопросы, которые непонятно к какой ГИС отнести
Ответить
Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9128
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 747
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Изменение кодировки DBF

Сообщение Максим Дубинин » 01 сен 2008, 21:45

Не подскажет ли кто-нибудь, есть ли в природе консольные утилиты для перевода DBF шейпфайлов из UTF-8 в Win-1251? Интересуют именно консольные утилиты, лучше всего под Unix, но если есть примеры под Win, то тоже пригодятся.
пристегивайтесь, турбулентность прямо по курсу

Аватара пользователя
JEY
Активный участник
Сообщения: 228
Зарегистрирован: 17 июл 2008, 13:42
Репутация: 1

Re: Изменение кодировки DBF

Сообщение JEY » 02 сен 2008, 09:55

Я тоже искал такие утилиты, была такая необходимость, но не нашел. Да и сроки сдачи проекта поджимали...

В результате пришлось дописывать специальный модуль, считывающий *.dbf "на лету", где конвертация в 1251 из UTF-8 происходила непосредственно в момент считывания файла.

Этот вариант меня вполне устроил и работает до сих пор в некоторых из моих проектов!

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9128
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 747
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Изменение кодировки DBF

Сообщение Максим Дубинин » 02 сен 2008, 18:32

расскажите поподробнее про реализацию, если не сложно. Это процедура? На каком языке? Реально ли ее использовать еще где-то?
пристегивайтесь, турбулентность прямо по курсу

Аватара пользователя
JEY
Активный участник
Сообщения: 228
Зарегистрирован: 17 июл 2008, 13:42
Репутация: 1

Re: Изменение кодировки DBF

Сообщение JEY » 03 сен 2008, 09:12

Это программный код, представляющий собой объект класса DBFReader, написанный на Visual Basic .NET. Объект этого класса напрямую связан с классом SHPReader, но суть не в этом...

Принцип работы этого класса основан на непосредственном считывании файла *.dbf и представлении его содержимого в виде таблицы в памяти компьютера. Класс снабжен методами для произвольного доступа к данным (но только в режиме "чтение"), а также связывания этих данных с другими произвольными объектами классов...

Считывание данных выполняется непосредственно в 1251, а не в UTF-8.
Это не изменяет принцип его работы, поскольку промежуточных конвертаций при этом не выполняется!

Часть этого кода можно включить в свои разработки. Если возникнет необходимость, то можно включать не сам исходный код, а производную от него библиотеку функций...

И наконец, поскольку исходный код основан на платформе Microsoft .NET Framework, то лучше всего применять его в рамках Microsoft Visual Studio .NET при разработке прикладных ГИС...

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Re: Изменение кодировки DBF

Сообщение KolesovDmitry » 03 сен 2008, 11:06

sim писал(а):Не подскажет ли кто-нибудь, есть ли в природе консольные утилиты для перевода DBF шейпфайлов из UTF-8 в Win-1251? Интересуют именно консольные утилиты, лучше всего под Unix, но если есть примеры под Win, то тоже пригодятся.
В свое время у меня вставала такая же задача, только нужно было перекодировать в обратном направлении. Готовых утилит я не нашел, пришлось написать небольшой скриптик на питоне. В основе его лежит библиотека, позволяющая работать с dbf файлами на питон dbfpy.
Вот пример кода, который переконвертирует файл towns.dbf из Win-1251в UTF-8 и сохраняет результат в файл test.dbf:

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

#!/usr/bin/python
#--*-- encoding: utf-8 --*--

from dbfpy import dbf # импортируем библиотеку
from types import *

db = dbf.Dbf("towns.dbf")
newDB=dbf.Dbf("test.dbf", new=True)

for f in db.header.fields: # копируем структуру dbf-файла
  newDB.addField(f)

for rec in db: # копируем записи из одного файла в другой
  r=newDB.newRecord()
  newData=[]
  for f in rec.fieldData:
    if type(f)==StringType: # если поле символьного типа - перекодируем
      f=unicode(f,'windows-1251')
      f=f.encode('utf-8')
    newData.append(f)
  r.fieldData=newData
  r.store() # сохраняем текущую запись

db.close()
newDB.close()
Библиотека удобная, своего кода писать немного - так что рекомендую :)
Последний раз редактировалось KolesovDmitry 30 май 2009, 08:34, всего редактировалось 1 раз.

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9128
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 747
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Изменение кодировки DBF

Сообщение Максим Дубинин » 04 сен 2008, 05:01

супер! действительно очень удобно и работает прекрасно, большое спасибо. Я засомневался было, съест ли Arcview сконвертированный вариант, проблем не возникло.

разумеется для конвертации UTF-8->Win 1251, в коде меняем:

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

      f=unicode(f,'windows-1251')
      f=f.encode('utf-8')
на

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

      f=unicode(f,'utf-8')
      f=f.encode('windows-1251')
еще, для тех кто столкнется, я по неопытности провозился минут 10, после скачивания библиотеки - выполняем команду, которая копирует dbfpy куда надо (а именно в site-packages):

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

python setup.py install
иначе все время будем получать ошибку

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

root@ubuntu:~/src/dbfpy-2.2.1/dbfpy# python dbfer.py
Traceback (most recent call last):
  File "dbfer.py", line 4, in <module>
    from dbfpy import dbf
ImportError: cannot import name dbf
пристегивайтесь, турбулентность прямо по курсу

azot101
Новоприбывший
Сообщения: 8
Зарегистрирован: 26 фев 2009, 21:09
Репутация: 0

Re: Изменение кодировки DBF

Сообщение azot101 » 29 окт 2009, 14:34

Извините, у меня вопрос, как этот скрипт( код) вставить в ArcGIS?

Аватара пользователя
paleogis
Модератор
Сообщения: 1112
Зарегистрирован: 22 мар 2009, 08:54
Репутация: 200
Ваше звание: Модератоо

Re: Изменение кодировки DBF

Сообщение paleogis » 29 окт 2009, 18:09

Не буду открывать Америку. Поменять кодировку можно в QGIS при экспорте в SHP

Аватара пользователя
Bzzzuka
Участник
Сообщения: 81
Зарегистрирован: 12 окт 2009, 13:06
Репутация: 0
Откуда: Казань
Контактная информация:

Re: Изменение кодировки DBF

Сообщение Bzzzuka » 11 окт 2010, 12:10

что нужно сделать чтобы это с shp сработало? Или это возможно в Qgis?

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Изменение кодировки DBF

Сообщение Александр Мурый » 11 окт 2010, 13:16

В QGIS сменить кодировку файла при открытии (или при сохранении в shp).
Редактор материалов, модератор форума

Ответить

Вернуться в «Общий - ПО»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 26 гостей