① 鏈接:https://pan.baidu.com/s/1qIeisigdgv0OIa-k9NtYZQ提取碼:jsjp
鏈接: https://pan..com/s/1qIeisigdgv0OIa-k9NtYZQ
② 在JavaScript怎麼把經緯度轉換成geohash
需要引入jquery!!
HTML:
<div>
<inputid="geohash"type="text"placeholder="GeoHash"maxlength="12">
<br><br>
<inputid="coordinate"type="text"placeholder="Lat,Lng"maxlength="40">
<br><br>
<inputid="precision"type="number"min="1"max="12"placeholder="Precision">
</div>
js代碼-執行代碼:
$('#geohash').keyup(function(){
varcoordinate=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);
}
});
functionvalidatePrecision()
{
varprecision=$('#precision').val();
if(!precision)
{
return'';
}
elseif(!$.isNumeric(precision))
{
return1;
}
elseif(precision>12)
{
return12;
}
elseif(precision<1)
{
return1;
}
returnprecision;
}
functiontoGeohash()
{
varprecision=$('#precision').val();
if(!$.isNumeric(precision))
{
precision=12;
}
varcoordinate=$('#coordinate').val().split(",");
varlatlng=coordinate;
if(latlng.length>=2)
{
varlat=latlng[0].trim();
varlng=latlng[1].trim();
if(/^(-?d+(.d+)?)$/.test(lat)&&/^(-?d+(.d+)?)$/.test(lng))
{
console.log(precision);
returnencodeGeoHash(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
//GeohashlibraryforJavascript
//(c)2008DavidTroy
//DistributendertheMITLicense
BITS=[16,8,4,2,1];
BASE32= "";
NEIGHBORS={right:{even:""},
left:{even:""},
top:{even:""},
bottom:{even:""}};
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;
functionrefine_interval(interval,cd,mask){
if(cd&mask)
interval[0]=(interval[0]+interval[1])/2;
else
interval[1]=(interval[0]+interval[1])/2;
}
functioncalculateAdjacent(srcHash,dir){
srcHash=srcHash.toLowerCase();
varlastChr=srcHash.charAt(srcHash.length-1);
vartype=(srcHash.length%2)?'odd':'even';
varbase=srcHash.substring(0,srcHash.length-1);
if(BORDERS[dir][type].indexOf(lastChr)!=-1)
base=calculateAdjacent(base,dir);
returnbase+BASE32[NEIGHBORS[dir][type].indexOf(lastChr)];
}
functiondecodeGeoHash(geohash){
varis_even=1;
varlat=[];varlon=[];
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};
}
functionencodeGeoHash(latitude,longitude,precision){
varis_even=1;
vari=0;
varlat=[];varlon=[];
varbit=0;
varch=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;
}
}
returngeohash;
}