在JavaScript怎么把经纬度转换成geohash?

JavaScript012

在JavaScript怎么把经纬度转换成geohash?,第1张

需要引入jquery!!

HTML:

<div>

    <input id="geohash" type="text" placeholder="GeoHash" maxlength="12">

    <br><br>

    <input id="coordinate" type="text" placeholder="Lat, Lng" maxlength="40">

    <br><br>

    <input id="precision" type="number" min="1" max="12" placeholder="Precision">

  </div>

js代码-执行代码:

$('#geohash').keyup(function() {

    var coordinate = decodeGeoHash(this.value)

    if (!coordinate || !coordinate.latitude[2] || !coordinate.longitude[2])

    {

        $('#coordinate').val('')

        $('#precision').val('')

    }

    else

    {

        $('#coordinate').val(coordinate.latitude[2].toFixed(8) + ", " + coordinate.longitude[2].toFixed(8))

        $('#precision').val(this.value.length)

    }

  })

  function validatePrecision()

  {

      var precision = $('#precision').val()      

      if (!precision)

      {

          return ''

      }

      else if (!$.isNumeric(precision))

      {

        return 1

      }

      else if (precision > 12)

      {

        return 12

      }

      else if (precision < 1)

      {

        return 1

      }

      return precision

  }

  function toGeohash()

  {

    var precision = $('#precision').val()

    if (!$.isNumeric(precision))

    {

      precision = 12

    }

    var coordinate = $('#coordinate').val().split(",")

    var latlng = coordinate

    if (latlng.length >= 2)

    {

        var lat = latlng[0].trim()

        var lng = latlng[1].trim()

        if (/^(\-?\d+(\.\d+)?)$/.test(lat) && /^(\-?\d+(\.\d+)?)$/.test(lng))

        {

          console.log(precision)

            return encodeGeoHash(lat, lng, precision)

        }

    }

    return ''

  }

  $('#coordinate').keyup(function() {

    $('#geohash').val(toGeohash())

  })

  $('#precision').change(function() {

    $('#precision').val(validatePrecision())

    $('#geohash').val(toGeohash())

  })

  $('#precision').keyup(function() {

    $('#precision').val(validatePrecision())

    $('#geohash').val(toGeohash())

  })

js代码-geohash.js

// geohash.js

// Geohash library for Javascript

// (c) 2008 David Troy

// Distributed under the MIT License

BITS = [16, 8, 4, 2, 1]

BASE32 =     "0123456789bcdefghjkmnpqrstuvwxyz"

NEIGHBORS = { right  : { even :  "bc01fg45238967deuvhjyznpkmstqrwx" },

left   : { even :  "238967debc01fg45kmstqrwxuvhjyznp" },

top    : { even :  "p0r21436x8zb9dcf5h7kjnmqesgutwvy" },

bottom : { even :  "14365h7k9dcfesgujnmqp0r2twvyx8zb" } }

BORDERS   = { right  : { even : "bcfguvyz" },

left   : { even : "0145hjnp" },

top    : { even : "prxz" },

bottom : { even : "028b" } }

NEIGHBORS.bottom.odd = NEIGHBORS.left.even

NEIGHBORS.top.odd = NEIGHBORS.right.even

NEIGHBORS.left.odd = NEIGHBORS.bottom.even

NEIGHBORS.right.odd = NEIGHBORS.top.even

BORDERS.bottom.odd = BORDERS.left.even

BORDERS.top.odd = BORDERS.right.even

BORDERS.left.odd = BORDERS.bottom.even

BORDERS.right.odd = BORDERS.top.even

function refine_interval(interval, cd, mask) {

if (cd&mask)

interval[0] = (interval[0] + interval[1])/2

  else

interval[1] = (interval[0] + interval[1])/2

}

function calculateAdjacent(srcHash, dir) {

srcHash = srcHash.toLowerCase()

var lastChr = srcHash.charAt(srcHash.length-1)

var type = (srcHash.length % 2) ? 'odd' : 'even'

var base = srcHash.substring(0,srcHash.length-1)

if (BORDERS[dir][type].indexOf(lastChr)!=-1)

base = calculateAdjacent(base, dir)

return base + BASE32[NEIGHBORS[dir][type].indexOf(lastChr)]

}

function decodeGeoHash(geohash) {

var is_even = 1

var lat = [] var lon = []

lat[0] = -90.0  lat[1] = 90.0

lon[0] = -180.0 lon[1] = 180.0

lat_err = 90.0  lon_err = 180.0

for (i=0 i<geohash.length i++) {

c = geohash[i]

cd = BASE32.indexOf(c)

for (j=0 j<5 j++) {

mask = BITS[j]

if (is_even) {

lon_err /= 2

refine_interval(lon, cd, mask)

} else {

lat_err /= 2

refine_interval(lat, cd, mask)

}

is_even = !is_even

}

}

lat[2] = (lat[0] + lat[1])/2

lon[2] = (lon[0] + lon[1])/2

return { latitude: lat, longitude: lon}

}

function encodeGeoHash(latitude, longitude, precision) {

var is_even=1

var i=0

var lat = [] var lon = []

var bit=0

var ch=0

geohash = ""

lat[0] = -90.0  lat[1] = 90.0

lon[0] = -180.0 lon[1] = 180.0

while (geohash.length < precision) {

  if (is_even) {

mid = (lon[0] + lon[1]) / 2

    if (longitude > mid) {

ch |= BITS[bit]

lon[0] = mid

    } else

lon[1] = mid

  } else {

mid = (lat[0] + lat[1]) / 2

    if (latitude > mid) {

ch |= BITS[bit]

lat[0] = mid

    } else

lat[1] = mid

  }

is_even = !is_even

  if (bit < 4)

bit++

  else {

geohash += BASE32[ch]

bit = 0

ch = 0

  }

}

return geohash

}

var ggPoint=[]

//循环获取转换前的坐标

for (var j = 0j <result.lengthj++) {

var poi = new BMap.Point(result[j].Longitude, result[j].Latitude)//获取转换前的坐标

ggPoint.push(poi)//循环写入经纬度到ggPoint这个数组

}

var bdpoi = GpsToBaiduPoints(ggPoint)//GpsToBaiduPoints调用的一个js

//循环写入转换后的坐标

for (var j = 0j <bdpoi.lengthj++) {

var poi = bdpoi[j]// new BMap.Point(bdpoi[j].Longitude, bdpoi[j].Latitude)

var myIcons = new BMap.Icon("/images/zdlcsgreen.png", new BMap.Size(12, 12))//这个在地图上显示的图片可以自己设置

var marker = new BMap.Marker(poi, { icon: myIcons })

var label = new BMap.Label(“转换后”, { offset: new BMap.Size(20, -10) })

map.addOverlay(marker)

marker.setLabel(label)

}