Формат координат для OSMHeader.HeaderBlock.bbox

Системы координат, проекции, преобразования, привязка
Ответить
snake32
Новоприбывший
Сообщения: 13
Зарегистрирован: 23 дек 2014, 13:48
Репутация: 0

Формат координат для OSMHeader.HeaderBlock.bbox

Сообщение snake32 » 23 дек 2014, 14:17

Доброго времени!
Не знаю куда задать вопрос, перенесите если надо.
Пишу парсер на Delphi XE2 osm.pbf. Проблема в том что результат заголовка, а точнее ограничивающий прямоугольник( OSMHeader.HeaderBlock.bbox ) никак не могу перевести понятные всем градусы из целых значений, которые судя по доке имеют такой формат:

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

message HeaderBBox {
   required sint64 left = 1;
   required sint64 right = 2;
   required sint64 top = 3;
   required sint64 bottom = 4;
}
Скачал ваши данные по Адыгеи RU-AD.osm.pbf от 22 дек
Из файла получил после перевода из sint64 в int64

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

left = 14723336
right = 2141057336
top = 139901391
bottom = 793120040
Что делать дальше понятия не имею. Помогите, вторые сутки бьюсь!
Хотя бы скажите какие значения должны быть в градусах bbox'a для RU-AD.osm.pbf от 22 дек

trir
Гуру
Сообщения: 5298
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1015
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Данные OpenStreetMap в форматах XML и PBF

Сообщение trir » 23 дек 2014, 14:45

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

latitude = .000000001 * (lat_offset + (granularity * lat))
longitude = .000000001 * (lon_offset + (granularity * lon))
Where latitude is the latitude in degrees, granularity is the granularity given in the PrimitiveBlock, lat_offset is the offset given in the PrimitiveBlock, and lat/lon is encoded in a Node or delta-encoded in a DenseNode. The explanation of the equation for longitude is analogous.
http://wiki.openstreetmap.org/wiki/PBF_Format

snake32
Новоприбывший
Сообщения: 13
Зарегистрирован: 23 дек 2014, 13:48
Репутация: 0

Re: Данные OpenStreetMap в форматах XML и PBF

Сообщение snake32 » 23 дек 2014, 15:07

Это работает только для Node и DenseNode. Для bbox явно написано:
https://github.com/scrosby/OSM-binary/b ... rmat.proto
/** The bounding box field in the OSM header. BBOX, as used in the OSM
header. Units are always in nanodegrees -- they do not obey
granularity rules. */
Однако при таком подходе цифры получаются очень маленькими(не адекватными).
Может у меня где-то ошибка... но странно то что используя те же ф-ии парсинга и другие элементы парсятся адекватно ,например, тот же DenseNode.

snake32
Новоприбывший
Сообщения: 13
Зарегистрирован: 23 дек 2014, 13:48
Репутация: 0

Re: Данные OpenStreetMap в форматах XML и PBF

Сообщение snake32 » 23 дек 2014, 15:16

Вообщем перебрал все координаты из DenseNode Из них получил адекватный bbox:
west = 37.3556236
east = 42.1248545
south = 43.2255077
north = 45.4420073

Как эти цифры скоррелировать с целыми из OSMHeader.HeaderBlock.bbox не понятно

Sergey Astakhov
Активный участник
Сообщения: 218
Зарегистрирован: 21 дек 2012, 01:57
Репутация: 52
Откуда: Питер

Re: Данные OpenStreetMap в форматах XML и PBF

Сообщение Sergey Astakhov » 24 дек 2014, 02:23

snake32 писал(а):Пишу парсер на Delphi XE2 osm.pbf. Проблема в том что результат заголовка, а точнее ограничивающий прямоугольник( OSMHeader.HeaderBlock.bbox ) никак не могу перевести понятные всем градусы из целых значений
Посмотрите исходники, благо они доступны.
osmconvert
Osmosis

Фрагмент кода из последнего:

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

double multiplier = .000000001;
double rightf = block.getBbox().getRight() * multiplier;
double leftf = block.getBbox().getLeft() * multiplier;
double topf = block.getBbox().getTop() * multiplier;
double bottomf = block.getBbox().getBottom() * multiplier;

Bound bounds = new Bound(rightf, leftf, topf, bottomf, source);
snake32 писал(а):Как эти цифры скоррелировать с целыми из OSMHeader.HeaderBlock.bbox не понятно
А они и не обязаны коррелировать. Главное требование - чтобы bbox включал в себя координаты данных, он не обязан быть минимально возможным. Например, если файл получен через обрезку или фильтрацию большего файла, то bbox может и не быть скорректирован, а остаться от этого большего файла.

snake32
Новоприбывший
Сообщения: 13
Зарегистрирован: 23 дек 2014, 13:48
Репутация: 0

Re: Формат координат для OSMHeader.HeaderBlock.bbox

Сообщение snake32 » 24 дек 2014, 16:43

Наконец-то! Ошибка была в парсинге varint -> uint64

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

// правильный вариант
procedure TMessage.ReadVarint( var data:uint64; f:TStream );
  var shift:uint64; t:byte;
begin
  data := 0;
  shift := 0;
  repeat
    t := readRawByte( f );
    data := data or uint64( t and $7f ) shl shift;
    Inc( shift, 7 );
  until( t <= $7f );
end;
// Ошибочный
procedure TMessage.ReadVarint( var data:uint64; f:TStream );
  var shift:uint64; t:byte;
begin
  data := 0;
  shift := 0;
  repeat
    t := readRawByte( f );
    data := data or byte( t and $7f ) shl shift;
    Inc( shift, 7 );
  until( t <= $7f );
end;
Спасибо всем участникам!

vladimiromsk
Новоприбывший
Сообщения: 2
Зарегистрирован: 21 июн 2015, 23:18
Репутация: 0

Re: Формат координат для OSMHeader.HeaderBlock.bbox

Сообщение vladimiromsk » 21 июн 2015, 23:26

Привет!
Не поделишься исходниками?
может объединиться в разработке настроим svn или git для синхронизации
в замен могу поделится своими наработками по серверу wms-server под delphi xe7

snake32
Новоприбывший
Сообщения: 13
Зарегистрирован: 23 дек 2014, 13:48
Репутация: 0

Re: Формат координат для OSMHeader.HeaderBlock.bbox

Сообщение snake32 » 07 июл 2015, 16:45

vladimiromsk писал(а):Привет!
Не поделишься исходниками?
Он у меня слишком медленный... пытался сделать универсальный pbf.
Если интересует скинь свою почту в личку.

Ответить

Вернуться в «Координаты и привязка»

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

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