代码之家  ›  专栏  ›  技术社区  ›  Sam Wilson

有人能把这个60位的值转换成地理坐标吗?

  •  2
  • Sam Wilson  · 技术社区  · 15 年前

    一些示例(编辑以包含更多示例):

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

    有什么标准的方法可以做到这一点吗?这是DB2惯例还是什么?有什么办法让我弄明白吗?

    谢谢!

    3 回复  |  直到 15 年前
        1
  •  6
  •   Peter Popov    15 年前

    这可能是 morton codes

    生成Morton数很容易。你所要做的就是把x和y坐标数转换成二进制。然后将这些位交错,得到莫顿数。哪一个先去并不重要,但你必须始终如一。

        2
  •  2
  •   Joe Kington    15 年前

    好吧,只是试着用各种方法解压十六进制值。。。

    #! /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位整数(>看起来有点像是某种投影坐标。。。

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

    如果是UTM,可能是UTM 50区,根据纬度,经度。。。我们不知道数据,但这不会造成超过几百米的差异。

    对于50区:

    (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 50区,无论如何。。。49区看起来也没什么好转。。。

        3
  •  1
  •   Yann Ramin    15 年前

    也许是UTM网格格式?

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

    当然,UTM中有很多变量(比如使用的数据)。