User:Ilis/Scripts

From OpenStreetMap Wiki
Jump to: navigation, search


WWW::Wikipedia

Получение названия статьи из другого языкового раздела:

Файл trwiki.pl

#!/usr/bin/perl

use WWW::Wikipedia;

my $wikientry = $ARGV[0];
my $fr = $ARGV[1];
my $to = $ARGV[2];
my $wiki = WWW::Wikipedia->new(language => $fr);
my $entry = $wiki->search($wikientry);
my $rawtext = $entry->raw()."\n";
my ($res) = $rawtext =~ /\[\[$to:([^\[]+)\]\]/;
print $res."\n";

Пример использования:

./trwiki pl "Светла-над-Сазавоу" ru cs

Světlá nad Sázavou


Получение списка названий:

Файл trwiki.sh

#!/bin/bash

while read LINE; do
	newname=`./trwiki.pl "$LINE" ru cs`
	echo $LINE":$newname"
done < $1

Пример использования:

./trwiki.sh namelist.txt

Geo::Parse::OSM

#!/usr/bin/perl

use Geo::Parse::OSM;

binmode STDOUT, ':utf8';

my $ru; my $cs; my $csname;
my %hash = ();
my $addname = sub {
	$csname = $_[0]->{tag}->{'name'};
	# $csname = decode( 'utf8', $_[0]->{tag}->{'name'});
	if ( $hash{$csname} ne '' && $_[0]->{tag}->{'name:ru'} eq '') {
		$_[0]->{action} = 'modify';
		$_[0]->{tag}->{'name:ru'} = $hash{$csname};
		print Geo::Parse::OSM->to_xml( $_[0] );
		# print decode( 'utf8', Geo::Parse::OSM->to_xml( $_[0] ) );
	} 
};

open MYINPUTFILE, '<:utf8', "ru_cs_towns.txt";
while(<MYINPUTFILE>) {
	chomp;
	($ru, $cs) = split /:/;
	$hash{$cs} = $ru;
	print "$cs --> $hash{$cs}\n";
}

binmode STDOUT;

print "<osm version='0.6'>\n";
Geo::Parse::OSM->parse_file( 'file.osm', $addname );
print "</osm>\n";

Скрипт получает список русских и оригинальных названий в виде

...
Светла-над-Сазавоу:Světlá nad Sázavou
Есенице:Jesenice
...

в файле ru_cs_towns.txt

и .osm-файл всех городов в какой-то области в файле file.osm

На выходе получается .osm-файл тех городов, которые находятся в списке ru_cs_towns.txt с действием 'modify' и дополнительным полем.

Особенности: загрузка файла в скрипте должна проходить через фильтр utf8, а печать из модуля без этого фильтра, поэтому в нужных местах включается директива binmode.