由于火星坐标的原因,国内地图经纬度经过了加密,在使用时需要加入纠偏值,若在国外使用则不需要加入纠偏值;还有在国内的经纬度逆地址解析和国外的逆地址解析会使用不同的接口。因此判断经纬度坐标是否在国内,变成了必须的一个操作,有没有更简单高效的方法呢?下面参考晚上来源信息,结合我们实际使用总结了一下方法,并附有C++函数代码。
基本思路是:把整个行政区域划分为几个小的矩形,然后再排除掉一些矩形区域。只要一个点在限定的区域内,并且不在排除的区域内,则判定成功,否则失败。下图中蓝色区域为限定区域,红色区域为排除区域。这种快速判定的方法是从Nokia map中挖掘出来的。
>> 优点:快速,相对准确;
>> 缺点:边界误差较大
![]() |
此方法实现代码如下
>> 函数功能:判断经纬度是否在中国
>> 函数名称:IsInsideChina
>> 输入参数: dbLatitude 查询纬度 dbLongitude 查询经度
>> 返回值:true 在中国,false不在中国
bool IsInsideChina(double dbLatitude,double dbLongitude)
{
double inChina[][4] = {
{49.220400,79.446200,42.889900,96.330000},
{54.141500,109.687200,39.374200,135.000200},
{42.889900,073.124600,29.529700,124.143255},
{29.529700,082.968400,26.718600,097.035200},
{29.529700,097.025300,20.414096,124.367395},
{20.414096,107.975793,17.871542,111.744104},
};
double outChina[][4] = {
{25.398623,119.921265,21.785006,122.497559},
{22.284000,101.865200,20.098800,106.665000},
{21.542200,106.452500,20.487800,108.051000},
{55.817500,109.032300,50.325700,119.127000},
{55.817500,127.456800,49.557400,137.022700},
{44.892200,131.266200,42.569200,137.022700},
};
for(int i=0;i<6;i++)
{
if(dbLatitude<=inChina[i][0] &&dbLatitude >=inChina[i][2] && dbLongitude>=inChina[i][1]&& dbLongitude<=inChina[i][3])
{
for(int j=0;j<6;j++)
{
if(dbLatitude<=outChina[j][0] &&dbLatitude>=outChina[j][2] && dbLongitude>=outChina[j][1]&& dbLongitude<=outChina[j][3])
{
return false;
}
}
return true;
}
}
return false;
}
本文基本思路来自:http://blog.csdn.net/cuibo1123/article/details/45691631
更多精彩内容请扫描以下二维码进行关注!
![]() |