osmconvert - как сохранить мультиполигоны, не попавшие в область

попробуй https://yadi.sk/d/I2r6n2-Y3LAwDT

gryphon
Спасибо, смогу попробовать завтра. О результате отпишусь.

У меня такую ошибку выдаёт

че-то я не смог слинковать нормально

ну да ладно, вот библиотека, надо кинуть в папку с утилитой https://yadi.sk/d/5xKkjET-3LB5aZ

Подкинул dll`ку, к сожалению не работает в батнике вместо 32бит версии.
PS: Батник с такими ключами:
osmconvert OSM.pbf -B=RU-MOW.poly -v --drop-author --emulate-osmosis --complete-ways --complex-ways -o=RU-MOW.osm

та же фигня с библиотекой или что-то новое?
можно запустить без батника, из командной строки и скинуть вывод?

Нет просто нет osm файлов на выходе.


osmconvert Parameter: CFO.pbf
Read-opening: CFO.pbf
Read-opening: increasing gzbuffer.
osmconvert Parameter: -B=RU-MOW.poly
- 0 379480000,555747000,379912000,555695000
cut
- 189 371217000,558466000,371224000,558480000
- 190 371224000,558480000,371231000,558466000
Border polygons: 191. Now sorting.
> 0 366419000,554629000,366987000,555613000
+ add to chain of 1
+ add to chain of 2
+ add to chain of 3
+ add to chain of 4
+ add to chain of 5
> 1 366419000,554629000,366798000,554250000
+ add to chain of 0
+ add to chain of 2
+ add to chain of 3
+ add to chain of 4
> 2 366495000,553790000,367063000,553508000
+ add to chain of 3
+ add to chain of 4
+ add to chain of 5
+ add to chain of 6
> 3 366495000,553790000,366810000,554002000
+ add to chain of 2
+ add to chain of 4
cut
+ add to chain of 189
+ add to chain of 190
> 187 381065000,557003000,381290000,557205000
+ add to chain of 188
+ add to chain of 189
+ add to chain of 190
> 188 381065000,557003000,381092000,556976000
+ add to chain of 187
> 189 381216000,557247000,381359000,557398000
+ add to chain of 190
> 190 381216000,557247000,381290000,557205000
+ add to chain of 189
Chains:
> 0 366419000,554629000,366987000,555613000
  1 366419000,554629000,366798000,554250000
> 1 366419000,554629000,366798000,554250000
cut
> 189 381216000,557247000,381359000,557398000
  186 381049000,557501000,381359000,557398000
  187 381065000,557003000,381290000,557205000
  190 381216000,557247000,381290000,557205000
> 190 381216000,557247000,381290000,557205000
  186 381049000,557501000,381359000,557398000
  187 381065000,557003000,381290000,557205000
  189 381216000,557247000,381359000,557398000
End of border initialization.
osmconvert Parameter: -v
osmconvert Error: unrecognized option: -v
Read-closing: CFO.pbf

А ошибка вас не смущает :slight_smile:

Попробовал без ключа -v, файл создаётся, но почему то не удаляются временные файлы osmconvert_tempfile.*


End of border initialization.
osmconvert Parameter: --drop-author
osmconvert Parameter: --emulate-osmosis
osmconvert Parameter: --complete-ways
osmconvert Parameter: --complex-ways
osmconvert Parameter: -o=C:\Russia\Maps\osm\RU-MOW.osm
osmconvert: zlib 1.2.8 flags: 00000065
Write-opening: C:\Russia\Maps\osm\RU-MOW.osm
Tempfiles: osmconvert_tempfile.10288.*
osmconvert: File timestamp: 2017-07-18T20:43:02Z
osmconvert: changing dependencystage from 0 to 11.
osmconvert: changing dependencystage from 11 to 12.
osmconvert: changing dependencystage from 12 to 22.
Write-opening: osmconvert_tempfile.10288.1
Write-opening: osmconvert_tempfile.10288.1
osmconvert: changing dependencystage from 22 to 32.
osmconvert: String table index restart 1
osmconvert: String table index restart 2
osmconvert: String table index restart 3
osmconvert: String table index restart 4
osmconvert: String table index restart 5
osmconvert: String table index restart 6
osmconvert: String table index restart 7
Write-opening: stdout
Write-reopening: C:\Russia\Maps\osm\RU-MOW.osm
Write-closing FD: 7
Interrelational hierarchy 1: 57 dependencies.
Interrelational hierarchy 2: 0 dependencies.
osmconvert: changing dependencystage from 32 to 33.
Read-opening: osmconvert_tempfile.10288.1
Read-opening: increasing gzbuffer.
osmconvert: Not a standard .o5m file header osmconvert_tempfile.10288.1
osmconvert: File timestamp: 2017-07-18T20:43:02Z
Relation hierarchies: 1 of maximal 12.
osmconvert: Last processed: relation 7403047.
Read-closing: osmconvert_tempfile.10288.1
Read-closing: CFO.pbf
Write-closing FD: 4
Write-closing FD: 4

Это нормально. Файлы не удаляются, т.к. включено логирование. Если будет работать с большими файлами и complete/complex-ways, можно будет собрать в нормальном виде.

А какие дополнительные дефайны добавляли, типа _LARGEFILE64_SOURCE ?

“Правильная” zlib без поллитры под виндой не собирается (в принципе, там ничего сложного, но официальной инструкции “как собрать zlib с поддержкой 64-битного gzseek” я не нашёл).
Ну и сам osmconvert написан весьма оригинально (как в нём автор ориентируется, интересно?..).

В-общем, было б неплохо предоставить необходимый и достаточный тестовый пример. pbf-ку побольше я с гислаба скачать могу, нужно всё остальное.

следующая версия https://yadi.sk/d/Vnwc4kut3LCBFm

Убрал отладку, прикрутил библиотеку к бинарнику. Собственно, нужно потестировать.

Я проверял так

osmconvert64-0.8.8p.exe local.osm.pbf -b=28,57,29,58 --complex-ways -o=pskov.osm

Если кто-то хочет повторить сборку

  1. ставим mingw-w64 (http://mingw-w64.org/)
  2. В PATH добавляем путь к папке bin
  3. качаем zlib
  4. zconf.h
    ищем кусок
#  if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)
#    define z_off64_t __int64

меняем на

#  if defined(_WIN32) && !defined(Z_SOLO)
#    define z_off64_t __int64

  1. win32/Makefile.gcc, добавляем в начало
LOC = -D_LARGEFILE64_SOURCE=1

  1. собираем библиотеку
gmake -fwin32/Makefile.gcc

  1. правим osmconvert.c
--- osmconvert.c.orig	2017-07-19 10:00:05.749701000 +0300
+++ osmconvert.c	2017-07-19 13:50:23.904084443 +0300
@@ -459,6 +459,7 @@
 "Please send any bug reports to markus.weber@gmx.com\n\n";
 
 #define _FILE_OFFSET_BITS 64
+#define Z_LARGE64 1
 #include <zlib.h>
 #include <inttypes.h>
 #include <stdlib.h>
@@ -530,7 +531,7 @@
   #define NL "\r\n"  // use CR/LF as new-line sequence
   #define off_t off64_t
   #define lseek lseek64
-  z_off64_t gzseek64(gzFile,z_off64_t,int);
+  //z_off64_t gzseek64(gzFile,z_off64_t,int);
   #define gzseek gzseek64
 #else
   #define NL "\n"  // use LF as new-line sequence
@@ -2418,7 +2419,7 @@
   #elif read_GZ==1
     err= fseek(read_infop->fi,0,SEEK_SET)<0;
   #else
-    err= gzseek(read_infop->fi,0,SEEK_SET)<0;
+    err= gzrewind(read_infop->fi)<0;
   #endif
   if(err) {
     PERRv("could not rewind file: %-80s",read_infop->filename)

  1. собираем osmconvert
cc -c osmconvert.c -O3 -IC:\Win-builds\tmp\zlib-1.2.11 -LC:\Win-builds\tmp\zlib-1.2.11  -o osmconvert.o
cc -static osmconvert.o -O3 -IC:\Win-builds\tmp\zlib-1.2.11 -LC:\Win-builds\tmp\zlib-1.2.11 -lz -o osmconvert64-0.8.8p.exe

Да, заработало. Мне по факту помогло только убирание !defined(GNUC) и два define

_LARGEFILE64_SOURCE=1
_LFS64_LARGEFILE=1

В самом osmconvert.c ни чего не трогал.

Да, точняк. Так намного лучше. Я пробовал без LFS: не взлетало.

gryphon
Огромное спасибо! Вроде все работает как надо!

Здравствуйте. Подскажите пожалуйста, в чем может быть проблема.
Выполняю этот запрос:

osmconvert --hash-memory=200 /sdcard/Download/MAP.o5m -b=37.63049,55.6768854025992,37.63549,55.6797045974008  --complete-ways -o=/sdcard/Download/1.xml

На win64 всё отлично, но на андроиде пишет:

osmconvert Warning: unexpected end of input file:

и на выходе пустой файл.
Если убираю complete-ways то всё отлично. Но отсекает нужные кусочки на стыке обрезки.

Неправильно собрали под андройд. Выше тема обсуждалась когда используется 32-битное число для смещения в файле, а он больше 4Гб.

Но у меня не такой большой файл. Всего 20МБ
А как правильно скомпилировать?

Решил проблему. Изменил read_GZ с 3 на 0:

#define read_GZ 0

Долго искал решение этой проблемы, поэтому добавлю в сообщение ключевые слова если можно:
osmconvert android complete-ways, unexpected end of input file