百度地图坐标与GPS坐标的转换

2018-3-25 C++

参考各种坐标的转换:https://blog.csdn.net/doulejian/article/details/70155080

GPS坐标在百度地图上显示位置:http://developer.baidu.com/map/jsdemo.htm#a5_2

获取百度地图坐标点:http://api.map.baidu.com/lbsapi/getpoint/index.html

#pragma once

static const double PI = 3.1415926535897932384626;
static const double A = 6378245.0;
static const double EE = 0.00669342162296594323;
class Gps
{
public:
Gps(void){}
~Gps(void){}
Gps(double wgLat, double wgLon)
{
SetWgLat(wgLat);
SetWgLon(wgLon);
}

double GetWgLat()
{
return m_wgLat;
}

void SetWgLat(double wgLat)
{
m_wgLat = wgLat;
}

double GetWgLon()
{
return m_wgLon;
}

void SetWgLon(double wgLon)
{
m_wgLon = wgLon;
}

Gps Transform(double lat, double lon)
{
if (TRUE == OutOfChina(lat, lon))
{
return Gps(lat, lon);
}

double dLat = TransformLat(lon - 105.0, lat - 35.0);
double dLon = TransformLon(lon - 105.0, lat - 35.0);
double radLat = lat / 180.0 * PI;
double magic = sin(radLat);
magic = 1 - EE * magic * magic;
double sqrtMagic = sqrt(magic);
dLat = (dLat * 180.0) / ((A * (1 - EE)) / (magic * sqrtMagic) * PI);
dLon = (dLon * 180.0) / (A / sqrtMagic * cos(radLat) * PI);
double mgLat = lat + dLat;
double mgLon = lon + dLon;
return Gps(mgLat, mgLon);
}

double TransformLat(double x, double y)
{
double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y
+ 0.2 * sqrt(abs(x));
ret += (20.0 * sin(6.0 * x * PI) + 20.0 * sin(2.0 * x * PI)) * 2.0 / 3.0;
ret += (20.0 * sin(y * PI) + 40.0 * sin(y / 3.0 * PI)) * 2.0 / 3.0;
ret += (160.0 * sin(y / 12.0 * PI) + 320 * sin(y * PI / 30.0)) * 2.0 / 3.0;
return ret;
}

double TransformLon(double x, double y)
{
double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y
+ 0.1 * sqrt(abs(x));
ret += (20.0 * sin(6.0 * x * PI) + 20.0 * sin(2.0 * x * PI)) * 2.0 / 3.0;
ret += (20.0 * sin(x * PI) + 40.0 * sin(x / 3.0 * PI)) * 2.0 / 3.0;
ret += (150.0 * sin(x / 12.0 * PI) + 300.0 * sin(x / 30.0 * PI)) 
* 2.0 / 3.0;
return ret;
}

BOOL OutOfChina(double lat, double lon) 
{
if (lon < 72.004 || lon > 137.8347)
{
return TRUE;
}
if (lat < 0.8293 || lat > 55.8271)
{
return TRUE;
}
return FALSE;
}

Gps Bd09ToGcj02(double bdLat, double bdLon)
{
double x = bdLon - 0.0065;
double y = bdLat - 0.006;
double z = sqrt(x * x + y * y) - 0.00002 * sin(y * PI);
double theta = atan2(y, x) - 0.000003 * cos(x * PI);
double ggLon = z * cos(theta);
double ggLat = z * sin(theta);
return Gps(ggLat, ggLon);

}

Gps Gcj02ToGps84(double bdLat, double bdLon)
{
Gps gps = Transform(bdLat, bdLon);
double lon = bdLon * 2 - gps.GetWgLon();
double lat = bdLat * 2 - gps.GetWgLat();
return Gps(lat, lon);
}

Gps Bd09ToGps84()
{
Gps gcj02 = Bd09ToGcj02(m_wgLat, m_wgLon);
Gps map84 = Gcj02ToGps84(gcj02.GetWgLat(), gcj02.GetWgLon());
return map84;
}

private:
double m_wgLat;
double m_wgLon;
};


标签: 百度坐标 GPS

评论(0) 浏览(1470)

windows程序崩溃时产生dmp

2017-12-30 C++

需求:windows程序崩溃时产生dmp

解决方案:

stdafx.h增加如下内容:

#include <Dbghelp.h>

//异常dmp捕获
void SetMyUnhandledExceptionFilter();

stdafx.cpp增加如下内容:

//生产DUMP文件
int GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExceptionPointers, PTCHAR pwAppName)
{
BOOL bOwnDumpFile = FALSE;
HANDLE hDumpFile = hFile;
MINIDUMP_EXCEPTION_INFORMATION ExpParam;

typedef BOOL(WINAPI * MiniDumpWriteDumpT)(
HANDLE,
DWORD,
HANDLE,
MINIDUMP_TYPE,
PMINIDUMP_EXCEPTION_INFORMATION,
PMINIDUMP_USER_STREAM_INFORMATION,
PMINIDUMP_CALLBACK_INFORMATION
);

MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;
HMODULE hDbgHelp = LoadLibrary(_T("DbgHelp.dll"));
if(NULL == hDbgHelp)
{
return EXCEPTION_EXECUTE_HANDLER;
}

pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
if(NULL == pfnMiniDumpWriteDump)
{
return EXCEPTION_EXECUTE_HANDLER;
}

if(hDumpFile == NULL || hDumpFile == INVALID_HANDLE_VALUE)
{
TCHAR szFileName[MAX_PATH] = { 0 };
TCHAR* szVersion = _T("v1.0");
int dwBufferSize = MAX_PATH;
SYSTEMTIME stLocalTime = { 0 };

GetLocalTime(&stLocalTime);

//wsprintf(szFileName, L"%s%s", szPath, szAppName);
//CreateDirectory(szFileName, NULL);
_stprintf_s(szFileName, MAX_PATH, _T("%s-%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp"),
pAppName,
szVersion,
stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond,
GetCurrentProcessId(), GetCurrentThreadId());
hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
}

if(hDumpFile != INVALID_HANDLE_VALUE)
{
ExpParam.ThreadId = GetCurrentThreadId();
ExpParam.ExceptionPointers = pExceptionPointers;
ExpParam.ClientPointers = FALSE;

pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &ExpParam : NULL), NULL, NULL);

CloseHandle(hDumpFile);
}

if(hDbgHelp != NULL)
{
FreeLibrary(hDbgHelp);
}
return EXCEPTION_EXECUTE_HANDLER;
}

LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
{
if (IsDebuggerPresent())
{
return EXCEPTION_CONTINUE_SEARCH;
}

return GenerateMiniDump(NULL, lpExceptionInfo, _T("XXXXX"));
}



void DisableSetUnhandledExceptionFilter()
{
 void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")) ,"SetUnhandledExceptionFilter");
if(addr)
{
unsigned char code[16] = { 0 };
int size = 0;
code[size++] = 0x33;
code[size++] = 0xC0;
code[size++] = 0xC2;
code[size++] = 0x04;
code[size++] = 0x00;

DWORD dwOldFlag,dwTempFlag;
VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
VirtualProtect(addr, size, dwOldFlag ,&dwTempFlag);
}
}


void SetMyUnhandledExceptionFilter()
{
SetUnhandledExceptionFilter(NULL);
SetUnhandledExceptionFilter(&ExceptionFilter);
DisableSetUnhandledExceptionFilter();
}

程序入口添加如下内容:

SetMyUnhandledExceptionFilter();

程序所在目录添加:DbgHelp.dll文件



标签: MFC dmp windows

评论(0) 浏览(15961)

git 基本操作记录

2017-12-9 C++

1. 创建空版本库方便上传已有版本库代码

git init --bare

2.项目代码加入git版本控制

git init //初始化git版本库

git add . //把当前项目文件夹内的文件加入版本控制

git commit -m "备注" //提交所有代码到版本库

3. 提交代码到远程版本库

git remote add usb h:\gitres\xxx //usb 远程版本库标识 h:\gitres\xxx 远程版本库位置

git push usb master //提交代码到远程版本库

4. 下载合并远程版本库变动到本体

git fetch usb :tmp //先下载远程版本库到tmp分支

git diff tmp    //刚获取的远程版本库跟本地文件的差异

git merge tmp    //合并远程版本库代码到本地

5. 新建分支切换

git checkout -b newbranch

6. 放弃当前修改

git checkout . //放弃所有的修改

git checkout -- file //放弃文件file的改动

标签: git

评论(0) 浏览(1224)

ado open 连接数据库卡住

2017-12-3 C++

情景:

程序采用ado访问access数据库

现象:

公司编译生成的程序在公司的电脑上运行没问题,但是到了客户的电脑上运行就卡住!

解决办法:

通过打印调试信息,发现程序是卡在数据库open的时候,就不往下走了!

对比了下ado版本,发现客户电脑上的ado版本比公司编译环境的低!

替换掉客户端电脑上的msado.dll,问题解决

标签: MFC ado windows

评论(0) 浏览(1219)

windbg调试句柄泄露

2017-11-22 C++

场景:程序运行后句柄一直往上增加,导致程序崩溃 解决办法:利用windbg提供的!htrace,分析未关闭的句柄 帮助:windbg命令行输入!htrace -?可以查看帮助 步骤: 使用windbg打开要调试的程序 1 在命令行输入”!htrace -enable” 打开句柄回溯 2 输入g启动程序运行 3 运行一会儿后正常关闭程序 4 输入!htrace 查看打开的句柄 5 输入!htrace -diff 分析未关闭的句柄

标签: windbg 调试 句柄泄露

评论(0) 浏览(1151)

windbg调试程序崩溃

2017-11-22 C++

场景:程序运行到一半崩溃,程序一开始有重定向dmp文件输出,到时到现场环境,崩溃后不产生dmp文件 解决方案:使用windbg启动程序 步骤: 可以使用windbg直接运行程序,启动后输入g,程序开始运行 也可以程序运行后windbg挂载上去 调试方法: 程序崩溃后输入!analyze -v分析可能出现崩溃的原因 使用.dump /m 转储路径!生成标准dmp文件 也可以通过.dump /ma 转储路径!生成完整dump文件 利用dmp文件分析崩溃原因 1.配置pdb路径(d:\mysymbol)为本地缓存路径 SRV*D:\mysymbol*http://msdl.microsoft.com/download/symbols 2命令行输入.reload 重新加载符号文件 3输入!analyze -v 分析可能产生崩溃的原因

标签: windbg 调试

评论(0) 浏览(1118)

c++面试

2017-9-6 C++

基础:

进程与线程的区别

写一个宏返回最小值

双向链表删除某个节点,插入节点

单链表反转

字符串反转

String构造类、操作符=重载

字符串循环右移

exe的文件头结构

虚构函数可以直接调用吗

构造函数初始化列表异常捕获

Makefile怎么编译一个文件

dll信息在exe头文件哪里

gdb调试bt有什么作用

算法:

    牛牛判断牛几算法

int grad(int *arr, int len)

{   

    for (int i = 0; i < len; i++)

    {   

        for (int j = 0; j < len; j++)

        {   

            for (int k = 0; k < len; k++)

            {   

                if (i !=j && i !=k && k != j)

                {   

                    if ((arr[i] + arr[j] + arr[k]) % 10 == 0)

                    {   

                        int sum = 0; 

                        for (int l = 0; l < len; l++)

                        {   

                            sum += arr[l];

                        }

                        return (sum - arr[i] - arr[j] - arr[k]) % 10;

                    }

                }

            }

        }

    }

    return -1;

}


    k个任务,每个任务有开始时间和结束时间,求24小时内最大执行任务数


    斗地主随机洗牌算法


Fisher–Yates shuffle 洗牌算法

void shuffle(int *arr, int len)

 {

    for (int i = len - 1; i >= 0; i--)

    {

        int randomIndex = rand() % (i + 1);

        int itemIndex = arr[randomIndex];

        arr[randomIndex] = arr[i];

        arr[i] = itemIndex;

    }

 }



使用:

    多线程无锁编程:

http://blog.csdn.net/zzulp/article/details/6259866


     send与write区别:


在功能上,read/write是recv/send的子集。read/wirte是更通用的文件描述符操作,而recv/send在socket领域则更“专业”一些。

当recv/send的flag参数设置为0时,则和read/write是一样的。

如果有如下几种需求,则read/write无法满足,必须使用recv/send:

  1. 为接收和发送进行一些选项设置
  2. 从多个客户端中接收报文
  3. 发送带外数据(out-of-band data)


标签: c++

评论(0) 浏览(1064)

mac 安装docker运行环境

2017-8-30 docker

1. docker Build,Ship, and Run Any App, Anywhere

    www.docker.org

1. 环境安装

    下载docker mac 版本安装

    https://www.docker.com/docker-mac

2. docker 镜像下载

    docker pull nginx

3. docker 镜像运行 挂载本地文件系统,映射端口

    docker run -ti -v /Users/xuyingqi/Desktop/project/nginx:/usr/shar/nginx -p 8080:80 nginx




标签: docker nginx

评论(0) 浏览(1153)

mac 手动添加路由

2017-8-30 vpn

查看路由:

netstat -nr

添加路由不走vpn通道:

sudo route add 112.124.184.150/8 192.168.1.253

标签: vpn route

评论(0) 浏览(1200)

git使用步骤

2017-3-13 C++

利用git进行代码版本管理步骤:

第一步:初始化版本库:

 进入要进行版本控制的代码目录执行:git init .

第一步:从其他版本库克隆过来:

如要从远程机器的test.git克隆项目:

git clone http://xxx/test.git test

第二步:对代码进行修改

第三步:提交修改的代码

git add .(这是提交所有有修改的文件,如果只要提交特定的文件请参阅git帮助)

第四步:提交说明:

git commit -m "测试提交"

第五步:push代码到远程版本库:

git push origin master


git相关命令说明:

git remote [-v] :查看远程目录地址


标签: git

评论(0) 浏览(1289)

Powered by EMLOG Copyright @ 狼酒 版权所有. 闽ICP备14012694号-2