Import în Maps
  [ Ignoră ]
RankRank
Jr. Member
Din: Bucureşti
Macuser din: 03.04.12

Salutare!

Aveţi idee cum pot importa nişte POI din bing maps în maps pe mac?

Merci!

Profil
 
  [ Ignoră ]   [ # 1 ]
Avatar
RankRankRank
Member
Din: Bucuresti
Macuser din: 11.10.05

Salut

Fișierul de Maps.app care ține bookmark-urile este ~Library/Containers/com.apple.Maps/Data/Library/SyncedPreferences/com.apple.Maps.plist.
Din păcate bookmark-urile sunt în format binar deci trebuie sa faci ceva inginerie pe dos (reverse engineering grin ) să te prinzi unde sunt scrise latitudinea si longtitudinea.

De exemplu la mine pe mașină (am 2 bookmark-uri, unul cu numele “Bucegi”):

Copiem plist-ul in /tmp ca sa-l stricăm fără probleme:

cd /tmp/
cp /Users/diciu/Library/Containers/com.apple.Maps/Data/Library/SyncedPreferences/com.apple.Maps.plist 

Convertim plist-ul la text (xml):

plutil -convert xml1 com.apple.Maps.plist 

Extragem nodurile de XML de interes (am două bookmark-uri in Maps.app, deci 2 noduri):

diciuxpath com.apple.Maps.plist  "/plist/dict/dict/dict/dict/data"
Found 2 nodes:
-- 
NODE --
<
data>
                
CAASBkJ1Y2VnaVFLOLIxErVGQFnQXWIlHX85QKEBhFpc
                KHq0RkCpAeAKewdzfTlAsQEAlHLrS6ujP7kBACDmrG0O
                pz8
=
                </
data>-- NODE --
<
data>
                
CAMSE1ByYWhvdmEg4oCUIFJvbWFuaWFRiyfajkS1RkBZ
                yNQr01Z
/OUChAYsn2o5EtUZAqQHI1CvTVn85QLEBAIC/
                
Z0AheD+5AQCAUKqVMYM/
                </
data

Decodăm conținutul primului nod din base64:

diciu$ (echo "import base64"; echo "print base64.b64decode('CAASBkJ1Y2VnaVFLOLIxErVGQFnQXWIlHX85QKEBhFpcKHq0RkCpAeAKewdzfTlAsQEAlHLrS6ujP7kBACDmrG0Opz8=')") | python hexdump --c
00000000  08 00 12 06 42 75 63 65  67 69 51 4b 38 b2 31 12  
|....BucegiQK8.1.|
0000000  \b  \0 022 006   B   u   c   e   g   i   Q   K   8   ?   1 022
00000010  b5 46 40 59 d0 5d 62 25  1d 7f 39 40 a1 01 84 5a  
|.F@Y.]b%..9@...Z|
0000010   ?   F   @   Y   ?   ]   b   035 177   9   @   ? 001 204   Z
00000020  5c 28 7a b4 46 40 a9 01  e0 0a 7b 07 73 7d 39 40  
|\(z.F@....{.s}9@|
0000020   \   (   z   ?   F   @   ? 001   ?  \n   {  \a   s   }   9   @
00000030  b1 01 00 94 72 eb 4b ab  a3 3f b9 01 00 20 e6 ac  |....r.K..?... ..|
0000030   001  \0 224   r   ?   K   ?   ?   ?   ? 001  \0       ?   ?
00000040  6d 0e a7 3f 0a                                    |m..?.|
0000040   m 016   ?   ?  \n                                            
0000045 

În hexdump-ul de mai sus se vede numele bookmark-ului în clar (“Bucegi”).
Latitudinea și longitudinea nu știu unde sunt (teoretic poți afla făcând un bookmark cvasi identic la 45 lat nord și 46 lat nord ca să vezi unde e octetul de latitudine, șamd).

Concluzia ar fi că dacă ai răbdare să sapi, probabil se poate.

Din păcate Maps.app nu e tocmai prietenos cu datele din exterior.

Profil
 
  [ Ignoră ]   [ # 2 ]
Avatar
RankRankRank
Member
Din: Bucuresti
Macuser din: 11.10.05

Pentru cine are chef să continue, mai jos offset-urile pentru latitudine si longitudine (sunt 2 perechi pentru fiecare bookmark):

>>> t=base64.b64decode("CAASBkJ1Y2VnaVFLOLIxErVGQFnQXWIlHX85QKEBhFpcKHq0RkCpAeAKewdzfTlAsQEAlHLrS6ujP7kBACDmrG0Opz8=")
>>> 
poiStringLength struct.unpack('B't[3])[0]
>>> poiName ''.join(t[4:poiStringLength])
>>> 
centerLat struct.unpack('d't[4 poiStringLength 1:poiStringLength 9])
>>> 
centerLon struct.unpack('d't[4 poiStringLength 10:poiStringLength 18])
>>> 
spanLat struct.unpack('d't[4 poiStringLength 20:poiStringLength 28])
>>> 
spanLon struct.unpack('d't[4 poiStringLength 30:poiStringLength 38])
>>> print 
"Name: %s, center lat: %s, center lon: %s, span lat: %s, span lon: %s" % (poiNamecenterLatcenterLonspanLatspanLon)
NameBucegicenter lat: (45.41461774065154,), center lon: (25.496538483157394,), span lat: (45.40997795590832,), span lon: (25.49003645662276,) 

Dacă vă iese un importer puneți aici că mă interesează și pe mine.

Profil
 
  [ Ignoră ]   [ # 3 ]
RankRank
Jr. Member
Din: Bucureşti
Macuser din: 03.04.12

Oooooook!
Merci tare mult.
E clar, le las în bing. E prea mare chinu’.

Profil