Карты Osm для Гис Руссы

Dell Axim x51v c windows mobile 6.1 тоже жалуется на карту Москвы… Может ее от области отделить?

Уррра! Заработало!

Дальнейшие исследования карт показали, что на карте города-героя Ярославля = 2Мб, прибавляя кусочками по 5-10 км, можно построить взи амопересек ающийся маршрут (в форме звезды) общей длиной более 150 Км(!). Может и дальше можно было бы, но прямого кусочка и нехватки памяти на этот раз добиться не удалось даже до этой длины.

Тревога была напрасной! У меня всё работает, и маршруты прокладываю тся по дорогам.

Это таки да из-за карты, вернее из-за её размера.

Исследования показали, что, прибавляя по небольшому кусочку к маршруту, в Москве маршрут прокладывае тся по дорогам до длины в один километр, далее начинает говорить, что не хват. памяти и просит выгрузить лишние программы и начинает маршрут класть по прямой. Карта сентябрь 2009=6,9Мб.
В Питере прокладывае тся таким же образом до длины 15 Км, далее начинает класть по прямой. Карта июнь2010=6,5Мб.

По современной же карте Москвы июнь 2010 =10,6 Мб первый же кусочек длиной 26 м уже вызывает реальную перегрузку и кладется сразу по прямой!

Странно, что ни у кого больше такой проблемы не возникает!

Zkir, а можно сделать для тех, у кого пока не ХР в машине, ещё одну карту Москвы, без области в прямоугольнике в который вписан мкад с зазором в 5 Км? Если обрежутся при этом загородные районы Москвы типа Митина и Жулебина, не страшно. Главное, чтоб размерчик был мааааленкий!

Можно конечно.

Хотя для эксперимента ты и сам можешь ее сделать - открой файл в GME, и обрежь (Tools - Trim outside)

Я им пользоваться не умею, даже не знаю кто такой gme. наверно какойто greatest map editor? Знающему человеку быстро, а я на розыск, установку и изучение три дня потрачу…

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

вот там выше ещё тоже кто-то просил сделать москву без области,- не все же из-за города на работу ездят, многие - на соседнюю улицу.

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

Область на карте Москвы нужна - факт. В добрую половину городов на расстоянии 5-10 км от МКАДа и даже в пределах МКАДа часто удобнее проехать не “тупо прямо”, а “слегка в объезд”. От Волоколамки до Марьино, когда на МКАДе пробка, то всегда еду в объезд через область (кроме куска Калужское ш. - Бутово, там объезда нет). Экономия по времени до 2-х часов. На фоне того, что от Рублёвки до Можайки можно ехать час, а потом от Можайки до Тёплого стана ещё полтара - это не кислый выигрыш :slight_smile:

Zkir, повесь пожалуйста маленькую карту москвы я сам не умею резать.

Повешу в понедельник, сейчас я вдали от цивилизации.

Собрал mp2rus на nc10/debian-squeeze-i386 (gcc-4.4).
Карта ЛО (с тремя из шести полос классификации в южной Карелии, еще не стертых к времени гислабовских поправок) занимает 15.7 Мб, и
сгенерировалась весьма шустро (превед лузерам из СГ 8)
и прекрасно работает на моем htcleo. Гармин 76Cx с этой картой, надо честно признать, тормозит.
Роутингом я не озадачивался, так что если у кого есть соображения, пишите сюда.
По крайней мере функциональность “магической” версии 27 мы будем иметь в опенсоурсном варианте.
Вот патч, который добавляет потерянный HuffmanCode.h, удаляет обкуренный синтаксис microsoft С++ и поддержку левых датумов:


diff -urN mp2rus/mapedit/HuffmanCode.h mp2rus-debian/mapedit/HuffmanCode.h
--- mp2rus/mapedit/HuffmanCode.h    1970-01-01 01:00:00.000000000 +0100
+++ mp2rus-debian/mapedit/HuffmanCode.h    2010-06-19 17:05:41.000000000 +0400
@@ -0,0 +1,91 @@
+# ifndef __HuffmanCode_H_
+# define __HuffmanCode_H_
+
+    //
+    // Huffman code table builder utility.
+    //
+    // NOTE: resulting codes lengths are assumed to be no longer then 32 bit.
+    //
+
+class CHuffmanCodeTable {
+  public:
+    CHuffmanCodeTable () :
+        m_cN (0),
+        m_pcP     (NULL),
+        m_pcLen   (NULL),
+        m_pdwCode (NULL),
+        m_cNonEmptyCodes (0)
+//        m_bFlat (false),
+//        m_bCanBeFlat (false)
+    {}
+    CHuffmanCodeTable (size_t _cN, bool _bCanBeFlat = false) {Init (_cN);}
+    ~CHuffmanCodeTable () {
+        delete [] m_pcP;
+        delete [] m_pcLen;
+        delete [] m_pdwCode;
+    }
+
+    void Init (size_t _cN) {
+        m_cN = _cN;
+        m_cNonEmptyCodes = 0;
+
+        m_pcP     = new size_t [_cN*2];
+        m_pcLen   = new size_t [_cN];
+        m_pdwCode = new DWORD  [_cN];
+        ::memset (m_pcP,     0, sizeof (* m_pcP)*_cN*2);
+        ::memset (m_pcLen,   0, sizeof (* m_pcLen)*_cN);
+        ::memset (m_pdwCode, 0, sizeof (* m_pdwCode)*_cN);
+//        m_bCanBeFlat = _bCanBeFlat;
+    }
+
+    void AddValue (size_t _cValue) {
+        assert (_cValue < m_cN);
+        if (m_pcP [_cValue] == 0) {
+            ++ m_cNonEmptyCodes;
+            assert (m_cNonEmptyCodes <= m_cN);
+        }
+        ++ m_pcP [_cValue];
+    }
+
+    void Build ();
+
+    size_t GetCodes () const {return m_cN;}
+    size_t GetNonEmptyCodes () const {return m_cNonEmptyCodes;}
+
+    bool IsCodePresent (size_t _cValue) const {
+        assert (_cValue < m_cN);
+        // NOTE: it is possible to have just one value in the table => with code len=0.
+        return GetCodeLen (_cValue) > 0 || m_pcP [_cValue] != 0;
+    }
+    size_t GetCodeLen (size_t _cValue) const {
+        assert (_cValue < m_cN);
+        return m_pcLen [_cValue];
+    }
+    const BYTE * GetCode (size_t _cValue) const {
+        assert (_cValue < m_cN);
+        return reinterpret_cast<const BYTE *> (& m_pdwCode [_cValue]);
+    }
+    const DWORD GetCodeValue (size_t _cValue) const {
+        assert (_cValue < m_cN);
+        return m_pdwCode [_cValue];
+    }
+
+    void BuildFlat ();
+//    bool IsFlat () const {return m_bFlat;}
+  private:
+    bool _BuildTree ();
+    void _VisitNode (size_t * _pTreeLeft, size_t * _pTreeRight, size_t _cNode, DWORD _dwCode, size_t _cLen);
+
+    size_t m_cN;
+    size_t * m_pcP;
+
+    size_t * m_pcLen;
+    DWORD  * m_pdwCode;
+
+    size_t m_cNonEmptyCodes;
+    size_t m_c17BitCodes;
+//    bool m_bFlat;
+//    bool m_bCanBeFlat;
+};
+
+# endif // __HuffmanCode_H_
diff -urN mp2rus/modified/TxtLoader.cpp mp2rus-debian/modified/TxtLoader.cpp
--- mp2rus/modified/TxtLoader.cpp    2009-09-26 12:50:52.000000000 +0400
+++ mp2rus-debian/modified/TxtLoader.cpp    2010-06-19 16:55:31.000000000 +0400
@@ -142,7 +142,7 @@
             return i->second;
     }
 
-    std::auto_ptr<CTransformationBase> m_pDatumTransformation;
+//    std::auto_ptr<CTransformationBase> m_pDatumTransformation;
 };
 
 LoadStatus_t loadTxt(const char * _strFileName, map_t * _pMap) {
@@ -206,7 +206,7 @@
 const char * _GetValue (const char * _pKey, const char * _pEnd) {
     if (_pKey >= _pEnd)
         return _pEnd;
-    const char * const p = reinterpret_cast<char *> (::memchr (_pKey, '=', _pEnd - _pKey));
+    const char * p = (const char *)memchr (_pKey, '=', _pEnd - _pKey);
     return p ? p + 1 : _pEnd;
 }
 
@@ -219,7 +219,7 @@
 
     const char * p = _pBegin;
     while (p + _cDelimiterLen <= _pEnd) {
-        p = reinterpret_cast<char *> (::memchr (_pBegin, * _strDelimiter, _pEnd - p));
+        p = (const char *)memchr (_pBegin, * _strDelimiter, _pEnd - p);
         if (p == NULL)
             return _pEnd;
         if (::memcmp (p + 1, _strDelimiter + 1, _cDelimiterLen - 1) == 0)
@@ -276,7 +276,7 @@
         ReportWarning (_pValue - m_pStart, "The inverse flattening is expected to be about 300.");
 
     CEllipsoid e (NULL, fA, 1/fInvFlattening);
-    m_pDatumTransformation = std::auto_ptr<CTransformationBase> (new CMolodensky_To_WGS84 (e, fDX, fDY, fDZ));
+//    m_pDatumTransformation = std::auto_ptr<CTransformationBase> (new CMolodensky_To_WGS84 (e, fDX, fDY, fDZ));
 
     return true;
 }
@@ -660,14 +660,14 @@
                     HasPrefix (_p + 2, pNextLine, "IMAGE,\"", 7) ||
                     HasPrefix (_p + 2, pNextLine, "FILE,\"", 6)
                 ) {
-                    const char * strFileNameBegin = reinterpret_cast<char *> (::memchr (_p + 2, '\"', pNextLine - _p - 1));
+                    const char * strFileNameBegin = (const char *)memchr (_p + 2, '\"', pNextLine - _p - 1);
                     if (strFileNameBegin)
                         ++ strFileNameBegin;
                     else {
                         ReportWarning (_p - m_pStart, "Unexpected format of attachment definition.");
                         break;
                     }
-                    const char * const strFileNameEnd = reinterpret_cast<char *> (::memchr (strFileNameBegin, '\"', pNextLine - strFileNameBegin - 1));
+                    const char * strFileNameEnd = (const char *)memchr (strFileNameBegin, '\"', pNextLine - strFileNameBegin - 1);
                     if (strFileNameEnd == NULL || strFileNameEnd > strFileNameBegin + MAX_PATH) {
                         ReportWarning (_p - m_pStart, "Unexpected format of attachment definition.");
                         break;
@@ -1502,7 +1502,7 @@
     m_RoadID2Object.clear ();
     m_NodeID2Node.clear ();
 
-    m_pDatumTransformation = std::auto_ptr<CTransformationBase> (NULL);
+//    m_pDatumTransformation = std::auto_ptr<CTransformationBase> (NULL);
 
     m_pComment = NULL;
     m_pLastSectionEnd = m_pStart;
@@ -1540,10 +1540,10 @@
     // Transform datum, if any.
     //
 
-    if (m_pDatumTransformation.get ()) {
-        ReportText ("Performing custom datum transformation to WGS 84...");
-        m_pMap->TransformPoints (* m_pDatumTransformation.get ());
-    }
+//    if (m_pDatumTransformation.get ()) {
+//        ReportText ("Performing custom datum transformation to WGS 84...");
+//        m_pMap->TransformPoints (* m_pDatumTransformation.get ());
+//    }
 
     //
     // Post-processing of [RESTRICT]'s.
diff -urN mp2rus/ported/Globals.h mp2rus-debian/ported/Globals.h
--- mp2rus/ported/Globals.h    2006-03-27 21:37:14.000000000 +0400
+++ mp2rus-debian/ported/Globals.h    2010-05-19 19:26:49.000000000 +0400
@@ -1,5 +1,6 @@
 # include <StdAfx.h>
 
+#define MAX_PATH 4096
 const float c_PI = 3.14159265358979f;
 const float c_Sqrt4 = 1.189207115f;
 

usm78-gis, если не сложно, выложи куда-нибудь .deb или тарболл с бинарниками - интересно, однако :slight_smile:

Исходники лежат здесь:
http://gisrussa.ru/ru/open_rus
Прямой линк:
http://sim77.ws/downloads/mp2rus.rar
Распаковывате архив, сохраняете патч mp2rus.diff , и делаете
patch -p1 < mp2rus.diff в директории mp2rus/
Потом ‘make’, и получаете mp2rus и checkmp.
Вот и вся наука.
Я бы вообще-то предпочел как-нибудь задокументировать формат (latex с картинками) и
потом написать модульный GPL компилятор/декомпилятор на C.
Вот это был бы реально кошерный пакет для debian (osm2rus).
За основу можно взять buildmap_osm из проекта roadmap.

usm78-gis, я не вполне понял, а готовый mp2rus.exe можешь выложить? и там запреты поворотов все-таки работают?

Эта версия для Линукса, я windows уже много годов не пользуюсь, а устанавливать кросс-компилятор для i386
слишком заморочно. Могу скомпилировать версию для wince-arm, но это врядли будет работать для
больших карт. А вот для linux-arm aka android вполне реально.
Запреты поворотов в исходниках mp2rus обрабатываются, и сохраняются в .rus
Для тех, кто не помнит историю gisrussa, этим компилятором (+они там что-то замутили с шифрованием карты, но врядли сильно заумное, типа pcks#12) были процессированы карты телеатласа для руссы.
Если же роутинговый баг в самой руссе, то без ее исходников сделать мало что можно.

Тот кто соберет (и потестирует) mp2rus.exe для виндоуз заслужит благодарность пользователей автоматических сборок (Osm-russa.narod.ru), потому я ее поставлю в процесс, потому что gme 27 теряет запреты.

Account suspended

http://narod.ru/disk/22056885000/mp2rus.rar.html
а патч выложенный на форуме “скушал” все табуляции
вот правильный патч:
http://narod.ru/disk/22057258000/mp2rus.diff.html

Быстро работают однако.
Значит наш форум читают и уважают 8)

mp2rus не понимает utf8, надо поправить (сама русса использует utf16)

В смысле не поддерживает? У меня нормально вроде отконвертилось.

У меня слетели все умляуты в финских названиях. mp2rus вроде как только делает cp1251->utf16

А, ну тогда понятно, у меня только русские надписи были.

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

16MB предел распространяется только на определенные 24bit оффсеты, так что еще не все потеряно,
может удастся и бОльшую карту создать. Сможет ли ее использовать русса - более сложный вопрос,
надо будет пробовать.