Name: swizard
Task: geo
Level: 4
Language: Common Lisp / sbcl
Work: ~55
Duration: 11

0. Требования к софту.
   - Steel Bank Common Lisp: http://www.sbcl.org
   - Iterate: http://www.cliki.net/iterate
   - Metatilities: http://www.cliki.net/metatilities

1. Сборка проекта.
   % make clean all

2. Запуск.
   % sbcl --core cl-geo.core --script run.lisp data/russian_federation.osm data/poly/mosobl.poly

   Подробно о ключах командной строки:
   % sbcl --core cl-geo.core --script run.lisp

3. Комментарии к постановке задачи.
   В процессе отладки я обнаружил некоторые моменты в исходных данных, которые я склонен считать багами:

   - В файле russian_federation.osm есть relation, у которого member'ом является он же сам (как так может быть?)
   - Эталонный osmosis выдает результаты, отличающиеся от постановки задачи:
     * В режиме completeWays=true + completeRelations=true он ВСЕ relations из исходного файла переносит в 
       результирующий, вне зависимости от их попадания в полигон обрезки.
     * В режиме completeWays=false + completeRelations=false он не обрезает ways и relations (все равно переносит
       сабтаги "nd" и "member", даже если таких node и ways нет (не попали в полигон)).

   Я не стал повторять такое поведение osmosis, а постарался придерживаться условия задачи.
   
4. Коментарии по имплементации.
   Обрезка карты происходит в три этапа:

   A. Описание полигона обрезки трансформируется в CL код, компилируется и кэшируется на диске.
      Последующие запуски программы этот пункт пропускают (сразу поднимают код из кэша).

   B. Исходный .osm файл трижды сканируется:
      * Первый раз целиком: каждая найденная "node" проверяется на принадлежность полигону обрезки 
        и, в случае успеха, сохраняется в индексе. Кроме того, запоминается offset первого найденного "way".
      * Второй раз, начиная с offset первого "way": каждый путь проверяется на принадлежность полигону
        и, в случае успеха, сохраняется в индексе. Кроме того, запоминается offset первого найденного "relation".
      * Третий раз, начиная с offset первого "relation": подобным образом обрабатыватываются все отношения. 
        Специальным образом рассматриваются рекурсивные их вхождения.

   C. Еще раз происходит полный проход по исходному файлу, в процессе которого в результирующий файл переносятся
      данные (на основании собранной в индексах информации).

5. Разное.
   Рекомендуется amd64, на i386 может работать несколько медленней.

