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

Тема в разделе "Навигация и Картография", создана пользователем Nikolay, 12 июн 2007.

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

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

    ( Единственное, что под вопросом - это русификация этой базы. Я просто не знаю, есть ли актуальные русские переводы ее.)
     
  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
     
  10. XYZ

    XYZ

    на rusa.su есть карта россии в векторе. кормить её надо в старую http://gisrussa.ru/russa.php
     

Поделиться этой страницей