ads

"Делай что можешь с тем, что имеешь, там, где ты есть". Теодор Рузвельт
Показаны сообщения с ярлыком Bash. Показать все сообщения
Показаны сообщения с ярлыком Bash. Показать все сообщения

воскресенье, 6 апреля 2014 г.

gdal_translate и gdalwarp для перепроицирования изображений

В составе проекта GDAL есть полезные утилиты для работы с изображениями через консоль

  • gdal_translate
  • gdalwarp

Для своего проекта dbCartajs мне потребовались изображения для разных проекций. Изображения я хочу вывести на канвас вместе с векторными данными. Для этого цели из программы Orbitron я позаимствовал картинку с плоской картой Земли в небольшом разрешении.

worldmap.jpg

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

Сначала, преобразуем исходную картинку в формат tiff - родной формат gdal - и задаем координаты привязки изображения.

gdal_translate -of Gtiff -co "TFW=YES" -a_ullr -180 90 180 -90 worldmap.png worldmap.tif

Для проекции Меркатора нужно ограничить размеры на полюсах (80-85 градусов).

gdal_translate -of Gtiff -projwin -180 84 180 -84 worldmap.tif worldmap-1.tif

Теперь формируем изображение в проекции Меркатора в формате tiff.

gdalwarp -s_srs EPSG:4326 -t_srs EPSG:3857 worldmap-1.tif worldmap-merc.tif

Браузер не работают с tiff, поэтому переводим его в jpeg.

gdal_translate -of JPEG worldmap-merc.tif worldmap-merc.jpg

Вот результат

worldmap-merc.jpg

Аналогично получаем картинки для других проекций, например ortho.

gdalwarp -s_srs EPSG:4326 -t_srs "+proj=ortho +lon_0=0 +lat_0=0" worldmap-1.tif worldmap-ortho.tif
gdal_translate -of JPEG worldmap-ortho.tif worldmap-ortho.jpg
worldmap-ortho.jpg

вторник, 11 февраля 2014 г.

Расширенный аналог утилиты wc в Linux

Скрипт рекурсивно считает число строк в файлах каталогов. Можно задавать маски поиска имен файлов на вхождение или не вхождение. Скрипт использовался в средах Windows и Linux (локаль koi8-r) для версии языка Python 2.4. Подробности вызова смотри в исходнике или в справке при вызове без параметров:

python pywc.py

Текст:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Выводит число строк, байт для каждого файла каталога рекурсивно и итоговую строку."""

import sys, os, re
import fileinput as i
import fnmatch as f

__version__ = '0.3'

E = lambda text: text.encode({'posix':'koi8-r', 'nt':'cp866'}.get(os.name))
_E = lambda text: text.decode({'posix':'koi8-r', 'nt':'cp866'}.get(os.name))
E_OS = lambda text: text.encode({'posix':'koi8-r', 'nt':'cp1251'}.get(os.name))
_E_OS = lambda text: text.decode({'posix':'koi8-r', 'nt':'cp1251'}.get(os.name))

STR_HELP = u"""\
Вызов: python pywc.py <папка> [<файл_масок> | - ]
Выводит число строк, байт для каждого файла в ПАПКЕ по маскам из ФАЙЛА_МАСОК.

ФАЙЛ_МАСОК содержит маски поиска на включение и исключение файлов, разделенных пустой строкой.
Если ФАЙЛ_МАСОК задан как -, читает стандартный ввод, если не задан, подсчитываются все файлы.

Пример файла:
  # включать
  *.c *.cpp
  *.h *.asm

  # исключать
  *\.svn\* *\stdafx.h

Примеры использования:
  python pywc.py .               Считать все файлы в текущем каталоге и ниже. 
  python pywc.py тест1 dir       Считать файлы в test1 и ниже, используя файл масок dir."""

REG_COL = '(?:[ \t]*#.*\r?\n?)*((?:[^\r\n]+\r?\n?)+)'
REG_ROW = '([^ \t\r\n]+)'

def subinfo(lines, size, files, _files, ts, lastprint=True):
    """Выводит расчеты в stdout."""
    print lines, size, ts
    print E(u'Посчитано файлов'), files, E(u'из'), files + _files             
    if (lastprint):
        print

args = sys.argv[1:]

if (not args):
    print E(STR_HELP)
    sys.exit(2)

# файл масок поиска и исключений
_wcfile = []
if (len(args) > 1):
    if (args[1] == '-'):
        wcfile = sys.stdin
    else:
        wcfile = file(args[1])
    _wcfile = re.findall(REG_COL, _E_OS(wcfile.read()))

res = []
for x in _wcfile:
    res += [re.findall(REG_ROW, x)]

# каталог подсчетов    
os.chdir(args[0])

dd = sublines = subsize = subfiles = _subfiles = None
totallines = totalsize = totalfiles = _totalfiles = 0
for root, dirs, files in os.walk(u'.', topdown=False):
    # подпапки
    if (root != dd):
        if (sublines):
            subinfo(sublines, subsize, subfiles, _subfiles, E(u'ИТОГО'))
        sublines = subsize = subfiles = _subfiles = 0
        dd = root
    for name in files:
        curname = os.path.normpath(os.path.join(root, name))
        absname = os.path.join(_E_OS(os.getcwd()), curname)
        if (res):      
            p = e = False        
            # вхождения
            for x in res[0]:
                p = (f.fnmatch(name, x) or f.fnmatch(curname, x) or f.fnmatch(absname, x))
                if (p):
                    break
            # исключения
            if (len(res) > 1 and p):            
                for x in res[1]:
                    e = (f.fnmatch(name, x) or f.fnmatch(curname, x) or f.fnmatch(absname, x))
                    if (e):
                        break                    
            if (not (p and (not e))):
                print >> sys.stderr, E(u'Игнорируем'), E(curname)
                _subfiles += 1
                _totalfiles += 1
                continue
        for line in i.input(E_OS(absname)):
            pass
        else:
            curlines, cursize = i.filelineno(), os.stat(curname)[6]            
            # по подпапкам
            sublines += curlines
            subsize += cursize
            subfiles += 1
            # всего
            totallines += curlines
            totalsize += cursize
            totalfiles += 1
            print curlines, cursize, E(curname)
            i.close()
else:
    if (sublines):
        subinfo(sublines, subsize, subfiles, _subfiles, E(u'ИТОГО'))

if (totallines):
    subinfo(totallines, totalsize, totalfiles, _totalfiles, E(u'ВСЕГО'), lastprint=False)

понедельник, 23 декабря 2013 г.

Перекодировка файлов в каталоге из Windows-1251 в UTF-8

Еще один конвертор на shell. Перекодировка всех файлов в указанном каталоге из Windows-1251 в UTF-8.

Маска файлов *.txt указана в скрипте в параметре для find. Для компактности ее можно вынести в параметр скрипта $2.

#!/bin/bash
# 
# Конвертим рекурсивно файлы из кодировки Windows в Юникод из каталога $1

export TMP_F=`mktemp`

trap "rm -f $TMP_F" EXIT

find "$1" -name \*.txt -print|while read x
do 
    echo $x
    iconv -f cp1251 -t utf8 "$x">$TMP_F && cat $TMP_F > "$x"
done

вторник, 1 октября 2013 г.

Конвертор mp3-файлов в VBR-формат

Конвертор mp3-файлов в VBR-формат с хорошим качеством и небольшим размером.

Удобен для сжатия mp3-файлов с большим битрейтом (256, 320 Кб/с). Использует утилиты lame и id3info.

#!/bin/bash
#
# Конвертор mp3-файлов в VBR-битрейт

# Вызов: bash mp3conv [каталог_с_mp3]
# egax

parse_tag ()
{
    retval=$(echo "$1" | grep -P "$2" | iconv -f CP1251 -t UTF-8)

    expr match "$retval" ".*:[ \\t]*\(.*\)"
}

cd "$1"
for curfile in *.mp3; do

    tag=$(id3info "$curfile")

    # берем поля тага
    title=$(parse_tag "$tag" TIT2)

    artist=$(parse_tag "$tag" TPE1)
    track=$(parse_tag "$tag" TRCK)

    year=$(parse_tag "$tag" TYER)
    album=$(parse_tag "$tag" TALB)

    newfile="$curfile"
    # новое имя файла $artist - [$track_]$title.mp3
    if [ ! -z "$artist" ] && [ ! -z "$title" ]; then

        if [ ! -z $track ]; then
            [ $track -lt 10  ] && track=0"$track"

            title="$track"_"$title"
        fi
        newfile="$artist"" - "$title".mp3"

    fi

    dirname=1
    # имя папки для новых файлов [$year_]$album
    if [ ! -z "$album" ]; then

        [ -z $year ] || album="$year"_"$album"
        dirname="$album"

    fi

    # создаем папку если не создана
    [ -d "$dirname" ] || mkdir "$dirname"

    newfile="$dirname"/"$newfile"

    # конвертим файл с VBR-битрейдом и копируем таги v2 и v1
    lame --vbr-new -B 192 "$curfile" "$newfile"

    id3cp -2 "$curfile" "$newfile"
    id3cp -1 "$curfile" "$newfile"
done