Может ли кто-нибудь преобразовать это 60-битное значение в географические координаты? - PullRequest
2 голосов
/ 28 июня 2010

У меня есть таблица базы данных (DB2), содержащая информацию о местоположении, один столбец которой - CHARACTER (16) и содержит одно шестнадцатеричное число.У меня есть программа, которая отображает их в виде точек на карте, но нет доступа к ее источнику.Изменение чисел перемещает точки на карте - я просто не знаю алгоритм.

Некоторые примеры (отредактированные, чтобы включить больше):

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

Существуют ли стандартные способы, которымиготово?Это какое-то соглашение DB2 или что-то?Любые идеи о том, как я мог понять это?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 30 июня 2010

Это может быть коды миньонов . Они используются для упаковки координат в одном измерении.

Создать число Мортона очень просто. Все, что вы делаете, это конвертируете координаты x и y в двоичные числа. Затем «чередуйте» биты, чтобы получить число Мортона. Неважно, что идет первым, но вы должны быть последовательны.

2 голосов
/ 28 июня 2010

Что ж, просто пытаюсь распаковать шестнадцатеричные значения различными способами ...

#! /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, основанная на широте и долготе.Мы не знаем данные, но разница не должна превышать пару сотен метров.

Для зоны 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 (ужасно непитонично)оболочки для 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 Zone 50S, во всяком случае ... А Zone 49 выглядит не лучше ...

Так, не сильно помогло, но я решил опубликовать это, чтобы помочь другим людям, которые, возможно, пробуют тот же путь ... (Я также пытался распаковывать вещи, поскольку плавающие объекты IBM вместо плавающих объектов IEEE ... Там тоже не повезло ...Может быть, я просто глуп, но у меня нет идей.Надеюсь, это немного поможет, хотя ...

1 голос
/ 28 июня 2010

Возможно, это формат сетки UTM?

http://www.uwgb.edu/dutchs/usefuldata/utmformulas.htm

В UTM, конечно, много переменных (например, используемый Datum).

...