База по нас. пунктам

#1
у когонить есть точки (желательно wpt для Ozi) населенных пунктов центральной россии?
пару сотен наставил - чуть не помер...
может кто-то эту работу за меня сделал?

зачем это нужно? навигатор у меня без карт, для комфортной навигации и чтобы реже дастовать бумажную карту, проставляю населенные пункты и основыные объекты.
 
#2
Актуальной базы всех населенных пунктов с координатами на всю Россию в природе не встречается. Можно попытаться добыть эту информацию из доступных векторных карт.
 
#4
Miroff написал(а):
Актуальной базы всех населенных пунктов с координатами на всю Россию в природе не встречается. Можно попытаться добыть эту информацию из доступных векторных карт.
- ? Еще как встречается! Лень рыть ссылки на Глобальную базу географических н.п., она в открытом доступе и свободна для использования.
Пример этой базы - сайт "ливня". На серверочках НАСА или НГА, и т.п.
есть актуальные первоисточники этой базы...Любую практически деревню
там можно сыскать, очень подробные данные. И легко автоматизировать
внесение населенных пунктов в ГИС-приложения: все в открытом тесктовом формате. (и даже можно не скачивать базу, а просто сделать автоматическое обращение к ней)

( Единственное, что под вопросом - это русификация этой базы. Я просто не знаю, есть ли актуальные русские переводы ее.)
 
#5
перевод ненужен. точки на навигаторе всеравно у мя не руссифициарованы.


а хоть в каком направлении искат то? а то на томже наса сам черт ногу сломит :(
 
#6
пасиб. все нашел. сейчас пишу програму обработки этих данных. обязательно суды выложу результаты (базу точек для ozi explorer)
 
#7
Вот на скорую руку набросал програмку для парсинга NGAшного файла rs.txt
Код:
program Project2;

{$APPTYPE CONSOLE}

uses
 SysUtils,StrUtils;
procedure parse(input:string;var lat:string;var lon:string;var name:string);
var
 buf:string;
 ltr:string;
 lp:integer;
 o:array[1..30] of string;
 ind:integer;
begin
 ind:=1;
 for lp:=0 to length(input) do
 begin
 ltr:=copy(input,lp,1);
 if ltr<>'	' then
 begin
  buf:=buf+ltr;
 end
  else if buf<>'' then
  begin
  o[ind]:=buf;
  ind:=ind+1;
  buf:='';
  end;
 end;
 lat:=o[4]+'000000000000000';
 lat:=copy(lat,0,10);
 lon:=o[5]+'000000000000000';
 lon:=copy(lon,0,10);
 name:=o[ind-3]+'      ';
 name:=copy(name,0,6);
end;

var
 f:textfile;
 buf:string;
 lat,lon,name:string;
 id:integer=0;
 i:real;
 c:integer;
 lat_b,lat_e,lon_b,lon_e:real;
 lat_c,lon_c:real;
begin
// Сюда вписываем координаты требуемого участка суши (начальная и конечная широта, начальна и конечная долгота)
 lat_b:=50;
 lat_e:=52;
 lon_b:=38;
 lon_e:=42;
//конец ввода координат
 assignfile(f,'./rs.txt');
 reset(f);
 readln(f,buf);
 while not eof(f) do
 begin
 readln(f,buf);
 parse(buf,lat,lon,name);
 val(lat,lat_c,c);
 val(lon,lon_c,c);
 if lat_c>=lat_b then
  if lat_c<=lat_e then
 if lon_c>=lon_b then
  if lon_c<=lon_e then
  begin
  id:=id+1;
  writeln('Waypoint,D,',name,', ',lat,', ',lon,',07/29/1997,21:59:09,
')
  end;
 end;
 closefile(f);
end.
на выходе имеет текстовый поток, пригодный для скармливания ozi explorer'у

это всего лишь заготовка. доделаю поудобнее и отпарсю ею данные по России.
позволяет сделать выборку по требуемому квадрату, ограниченному начальной и конечной широтой и долготой


сделал себе базу по нас.пунктам воронежской области при помощи этой приблуды. работает отлично. с картой совпаает. я чертовски доволен.
вот только некоторые названия по русски в юникоде -что не позволяе пхнуть их в навигатор. завтра допишу кусок кода отвечающий за транслитерацию и более удобный ввод ограничивающих координат. также возможно получится делать выборку по размеру нас.пункта и прочис условиям (если разберусь в назначении полей в GNS файле)
финальный вариант выложу сюда.

скомпилированный экзешник дать немогу, ибо програмлю под линухой и в .exe скомпилить нет возможности.


ps: просьба не пинать за качество кода :) в три часа ночи и двумя литрами пива, более качественее писать не получается, но тем не менее оно зарботало и выдала то что мне надл.
 
#8
Николай, да ты крут! В смысле и парсеры ваять, и так грамотненько под Линуксом работать, как белый человек!
 
#9
вот мой второй рабочий вариант. на нем и остановился.
(консольная, ибо нелюблю я всю эту графику и красивости)
Код:
program Project2;

{$APPTYPE CONSOLE}

uses
 SysUtils,StrUtils;

function TranslitRus2Lat(const Str: string): string;
const
 RArrayL = 'абвгдеёжзийклмнопрстуфхцчшщьыъэюя';
 RArrayU = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ';
 colChar = 33;
 arr: array[1..2, 1..ColChar] of string =
 (('a', 'b', 'v', 'g', 'd', 'e', 'yo', 'zh', 'z', 'i', 'y',
  'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f',
  'kh', 'ts', 'ch', 'sh', 'shch', '''', 'y', '''', 'e', 'yu', 'ya'),
  ('A', 'B', 'V', 'G', 'D', 'E', 'Yo', 'Zh', 'Z', 'I', 'Y',
  'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F',
  'Kh', 'Ts', 'Ch', 'Sh', 'Shch', '''', 'Y', '''', 'E', 'Yu', 'Ya'));
var
 i: Integer;
 LenS: Integer;
 p: integer;
 d: byte;
begin
 result := '';
 LenS := length(str);
 for i := 1 to lenS do
 begin
  d := 1;
  p := pos(str[i], RArrayL);
  if p = 0 then
  begin
   p := pos(str[i], RArrayU);
   d := 2
  end;
  if p <> 0 then
   result := result + arr[d, p]
  else
   result := result + str[i];
 end;
end;


procedure parse(input:string;var lat:string;var lon:string;var name:string; var ntname:string);
var
 buf:string;
 ltr:string;
 lp:integer;
 o:array[1..30] of string;
 ind:integer;
begin
 ind:=1;
 for lp:=0 to length(input) do
 begin
 ltr:=copy(input,lp,1);
 if ltr<>'	' then
 begin
  buf:=buf+ltr;
 end
  else if buf<>'' then
  begin
  o[ind]:=buf;
  ind:=ind+1;
  buf:='';
  end;
 end;
 lat:=o[4]+'000000000000000';
 lat:=copy(lat,0,10);
 lon:=o[5]+'000000000000000';
 lon:=copy(lon,0,10);
 name:=TranslitRus2Lat(UTF8Decode(o[ind-3]));
 ntname:=UTF8Decode(o[ind-3]);
end;

var
 f,o:textfile;
 buf:string;
 lat,lon,name,ntname:string;
 id:integer=0;
 i:real;
 c:integer;
 lat_b,lat_e,lon_b,lon_e:real;
 lat_c,lon_c:real;
 ind:integer;
 sym:byte;
 pr:string='=========================';
begin
 lat_b:=50;
 lat_e:=52;
 lon_b:=38;
 lon_e:=42;
 ind:=0;
 writeln('Выборка населенных пунктов по данным NGA');
 writeln('----------------------------------------');
 write('начальная широта :');readln(lat_b);
 write('конечная широта :'); readln(lat_e);
 write('начальная долгота:'); readln(lon_b);
 write('конечная долгота :'); readln(lon_e);
 assignfile(f,'./rs.txt');
 reset(f);
 assignfile(o,'./out.txt');
 rewrite(o);
 readln(f,buf);
 writeln('');
 writeln('идет выборка...');
 writeln('');
 writeln('0..........50.........100');
 while not eof(f) do
 begin
 ind:=ind+1;
 readln(f,buf);
 parse(buf,lat,lon,name,ntname);
 val(lat,lat_c,c);
 val(lon,lon_c,c);
 if lat_c>=lat_b then
  if lat_c<=lat_e then
 if lon_c>=lon_b then
  if lon_c<=lon_e then
  if name=ntname then
  begin
  id:=id+1;
  writeln(o,'Waypoint,D,',name,', ',lat,', ',lon,',07/29/1997,21:59:09,
')
  end;
  if ind/100=(ind div 100) then
  begin
  writeln (copy(pr,0,ind *25 div 517200));
  writeln('обработано:',ind,' (',ind *100 div 517200,'%)');
  writeln('удовлетворяет условиям:',id);
  writeln(chr(27),'[4A');
  end;
 end;
 closefile(o);
 closefile(f);
 writeln('');
 writeln('');
 writeln('');
 writeln('');
 writeln('выборка окончена. результаты сохранены в out.txt');
end.
в NGA имеются и русские и латинские названия. русские мне не нужны (вернее они обрабатываются из utf8, транслитеруются в латиницу, но в данной версии отбрасываются, ибо в 99% случаев совпадают с уже имеющимися английскими названиями)
на входе файл rs.txt на выходе файл out.txt
вводим начальные и конечные широты и долготы. ждем пока прогрессбар добежит до сотни и пхаем файлик out.txt импортом в ozi explorer

кому интересно - вот результаты работы программки по кусочку воронежской области. так, для теста прогнал кусочек lat:50..52 lon:38,5..40
http://derusov.selfip.com/out.txt
 
Сверху