using System;
using System.Collections.Generic;
using System.Text;
namespace Hiho
{
class _125
{
private static List<char> Base32 = new List<char>() { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
static string GeoEncode(double latitude, double longitude, int precision)
{
// precision 表示最后得到的geohash编码长度
double[] latitudeInterval = { -90, 90 };
double[] longitudeInterval = { -180, 180 };
int length = precision * 5;
StringBuilder geohash = new StringBuilder();// 初始化为空字符串
int bits = 0;// 记录二进制码
for (int i = 1; i <= length; ++i)
{
if (i % 2 == 1)// 奇数位为经度
{
double mid = (longitudeInterval[0] + longitudeInterval[1]) / 2;
if (longitude > mid)
{
bits = bits * 2 + 1; // 二进制码设定为1
longitudeInterval[0] = mid;// 更新区间
}
else
{
bits = bits * 2;// 二进制码设定为0
longitudeInterval[1] = mid;
}
}
else
{
double mid = (latitudeInterval[0] + latitudeInterval[1]) / 2;
if (latitude > mid)
{
bits = bits * 2 + 1;// 二进制码设定为1
latitudeInterval[0] = mid; // 更新区间
}
else
{
bits = bits * 2;// 二进制码设定为0
latitudeInterval[1] = mid;// 更新区间
}
}
if (i % 5 == 0)
{
geohash.Append(Base32[bits]);
bits = 0;
}
}
return geohash.ToString();
}
static void GeoDecode(string geohash, out double lat, out double lon)
{
bool odd = true; // 当前计算位的奇偶性
double[] latitudeInterval = { -90, 90 };
double[] longitudeInterval = { -180, 180 };
for (int i = 0; i < geohash.Length; ++i)
{
int bits = Base32.IndexOf(geohash[i]); // 找到第i个字符对应的数
for (int j = 4; j >= 0; --j)
{
int bit = (bits >> j) & 1; // 通过位运算取出对应的位
if (odd) // 奇数位为经度
{
double mid = (longitudeInterval[0] + longitudeInterval[1]) / 2;
longitudeInterval[1 - bit] = mid;
}
else
{
double mid = (latitudeInterval[0] + latitudeInterval[1]) / 2;
latitudeInterval[1 - bit] = mid;
}
odd = !odd;
}
}
lat = (latitudeInterval[0] + latitudeInterval[1]) / 2;
lon = (longitudeInterval[0] + longitudeInterval[1]) / 2;
}
static void Main(string[] args)
{
string[] lineArray = Console.ReadLine().Split(' ');
int N = int.Parse(lineArray[0]), M = int.Parse(lineArray[1]);
for (int i = 0; i < N; ++i)
{
lineArray = Console.ReadLine().Split(' ');
Console.WriteLine(GeoEncode(double.Parse(lineArray[0]), double.Parse(lineArray[1]), 10));
}
for (int i = 0; i < M; ++i)
{
double X = 0, Y = 0;
GeoDecode(Console.ReadLine(), out X, out Y);
Console.WriteLine(X.ToString("F6") + " " + Y.ToString("F6"));
}
Console.Write("");
}
}
}
Hiho 125 GeoHash一·编码解码
最新推荐文章于 2022-12-16 11:49:23 发布