需要引入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)
}