2010-06-28 46 views
2

我有一個包含位置信息的(DB2)數據庫表,其中一列是CHARACTER(16)幷包含一個單一的十六進制數字。我有一個程序將這些顯示爲地圖上的點,但無法訪問其來源。改變數字會移動地圖上的點 - 我只是不知道算法。任何人都可以將此60位值轉換爲地理座標嗎?

一些例子(編輯以包括更多):

04867C279DE2D6EC -32.063657° 115.7658683° 
04867C27C030085E -32.0633982° 115.7649085° 
04867C27C230A5FE -32.0633846° 115.7653336° 

是否有這樣做的任何標準的方法?這是一些DB2約定還是什麼?關於如何解決這個問題的任何想法?

謝謝!

+0

還有一組<十六進制,緯度,經度>將使這個問題交代。 – msw 2010-06-28 06:35:14

+0

已添加。但是,我不確定那些座標是否完全準確;可能會有一些四捨五入的情況發生。 – 2010-06-28 06:50:37

回答

6

這可能是morton codes。他們用於包裝座標的一個維。

生成莫頓號碼是很容易。你所做的只是將x和y座標轉換爲二進制。然後「交錯」這些比特以獲得莫頓數。先走哪個並不重要,但你必須保持一致。的

+1

是的!就是這個!這些值正在被成功分割,並且當一個被修改並且被重新組合時,地圖上的點僅在一個維度上移動。所以,現在我只需要弄清楚他們指的是什麼網格。 – 2010-07-01 05:59:00

2

好了,只是想解開各種方式的十六進制值...

#! /usr/bin/python 
import struct 
import binascii 

a = '04867C279DE2D6EC' 
b = '04867C27C030085E' 
c = '04867C27C230A5FE' 

formats = ['2I', '2i', '2f', 'd', '4h', '4H'] 
formats += ['>'+item for item in formats] 

for fmt in formats: 
    print fmt, '-->' 
    for item in [a,b,c]: 
     coords = struct.unpack(fmt, binascii.unhexlify(item)) 
     print ' ', coords 

取得了一些想法......

2I --> 
    (662472196, 3973505693) 
    (662472196, 1577595072) 
    (662472196, 4272238786) 
2i --> 
    (662472196, -321461603) 
    (662472196, 1577595072) 
    (662472196, -22728510) 
2f --> 
    (3.5044675291578432e-15, -2.07824221089183e+27) 
    (3.5044675291578432e-15, 2.4533886735682109e+18) 
    (3.5044675291578432e-15, -1.0978789217059195e+38) 
d --> 
    (-1.9722947342913136e+216,) 
    (9.4395557694675488e+144,) 
    (-1.135288151092706e+302,) 
4h --> 
    (-31228, 10108, -7523, -4906) 
    (-31228, 10108, 12480, 24072) 
    (-31228, 10108, 12482, -347) 
4H --> 
    (34308, 10108, 58013, 60630) 
    (34308, 10108, 12480, 24072) 
    (34308, 10108, 12482, 65189) 
>2I --> 
    (75922471, 2648889068) 
    (75922471, 3224373342) 
    (75922471, 3257968126) 
>2i --> 
    (75922471, -1646078228) 
    (75922471, -1070593954) 
    (75922471, -1036999170) 
>2f --> 
    (3.1617264522911893e-36, -6.0043925910101893e-21) 
    (3.1617264522911893e-36, -2.7505106925964355) 
    (3.1617264522911893e-36, -44.162101745605469) 
>d --> 
    (7.3832340678903009e-287,) 
    (7.3832347392384709e-287,) 
    (7.383234778429458e-287,) 
>4h --> 
    (1158, 31783, -25118, -10516) 
    (1158, 31783, -16336, 2142) 
    (1158, 31783, -15824, -23042) 
>4H --> 
    (1158, 31783, 40418, 55020) 
    (1158, 31783, 49200, 2142) 
    (1158, 31783, 49712, 42494) 

拆開它作爲一個大端無符號32位整數( > 2I)看起來有點像它可能被投射某種座標......

(-32.063657, 115.7658683) --> (75922471, 2648889068) 
(-32.0633982, 115.7649085) --> (75922471, 3224373342) 
(-32.0633846, 115.7653336) --> (75922471, 3257968126) 

如果是在UTM,它的可能是UTM Zone 50S,基於lat,long ...我們不知道基準,但是這不應該超過幾百米的差距。

有關區域50S:

(lat, long) --> (Easting, Northing) 
(-32.063657, 115.7658683) --> (383506.31320936838, 6451842.2821839228) 
(-32.0633982, 115.7649085) --> (383415.3800562254, 6451869.9348384682) 
(-32.0633846, 115.7653336) --> (383455.49221963808, 6451871.9016738012) 

(使用OSR的(可怕unpythonic)Python包裝......)

from osgeo import osr 
def latlong2utm(lat, long): 
    epsg_wgs84 = 4326 
    epsg_utm50S = 32750 
    inproj = osr.SpatialReference() 
    inproj.ImportFromEPSG(epsg_wgs84) 
    outproj = osr.SpatialReference() 
    outproj.ImportFromEPSG(epsg_utm50S) 
    transform = osr.CoordinateTransformation(inproj, outproj) 
    x,y,_ = transform.TransformPoint(long, lat) 
    return x, y 

不幸的是,它看起來並不像UTM區50S,反正.. 。和區域49不看任何好轉...

所以,沒有太大的幫助,但我想我會張貼此幫助誰可能試圖在同一路徑其他人......(我也試過拆包IBM轉而採用o的東西f IEEE漂浮...沒有運氣那裏要麼...)也許我只是愚蠢的,但我沒有想法。希望這有助於一點,但...

+1

使用OSR +1。儘管Python包裝是......奇怪的...我仍然發現它是交互式座標系變換的一個令人難以置信的強大工具。 – 2010-06-29 21:10:54

相關問題