我们希望将 Google 地图集成到我们的 C/C++ win32 应用程序中。整个想法是当用户第一次运行应用程序时,我们要求他们标记他们的位置,然后检索用户选择位置的坐标并保存到数据库或文件中。
初始化后,我们希望为用户提供一些预先标记的位置,并允许用户找到从他们的位置到那个位置的方向。将提供预标记位置的坐标。
是否可以通过使用 Google Api 来实现我们想要的,如果可以,那么如何实现?如果有关于它的法律问题?
谢谢。
我们希望将 Google 地图集成到我们的 C/C++ win32 应用程序中。整个想法是当用户第一次运行应用程序时,我们要求他们标记他们的位置,然后检索用户选择位置的坐标并保存到数据库或文件中。
初始化后,我们希望为用户提供一些预先标记的位置,并允许用户找到从他们的位置到那个位置的方向。将提供预标记位置的坐标。
是否可以通过使用 Google Api 来实现我们想要的,如果可以,那么如何实现?如果有关于它的法律问题?
谢谢。
对于法律问题的答案,最好的地方是查看服务条款,然后当然咨询律师。Maps API 的服务条款和 Maps for Business 服务条款都明确禁止在地理编码数据不与 Google 地图结合使用时使用:
Maps API TOS,相关点是第 10.1.1 (g) 节: https ://developers.google.com/maps/terms#section_10_1
商业地图购买协议,相关点为 4.1 (l): https ://www.google.com/enterprise/earthmaps/legal/us/maps_purchase_agreement.html
如果您需要更自由的替代方案,您可能需要查看http://www.openstreetmap.org/ - 那里提供的地理编码数据包含在开放数据库许可证下,该许可证允许使用归属地。
您可以在 Windows 上使用 Qt 框架。您可以将您的 win32 应用程序与 Qt 集成。在 Qt 中,您可以使用QWebKit框架与您的应用程序和网页(在这种情况下是包含来自 Google 地图的地图的页面)进行通信。实际上,您可以使用 Qt 编写混合应用程序。查看 Qt QWebKit文档。
我需要同样的,并通过浏览器对象连接谷歌地图来解决它。
*** 请阅读有关WebBrowser 控件兼容性的信息并按照说明进行操作。
创建一个基于MFC对话框的项目。
添加一个 CExplorer 控件。(参见:https ://msdn.microsoft.com/en-us/library/aa752046(v=vs.85).aspx )。
当你的程序的主对话框初始化时,你需要初始化一个全局对象
CExplorer1 m_Browser;
第一个构建块是 WriteHTML()
void WriteHTML(const wchar_t* html)
{
IDispatch* pHtmlDoc = m_Browser.get_Document();
if (!pHtmlDoc)
return;
CComPtr<IHTMLDocument2> doc1 = NULL;
doc1.Detach();
doc1.Attach((IHTMLDocument2*)pHtmlDoc);
if (!doc1)
return;
// Creates a new one-dimensional array
SAFEARRAY* psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1);
if (!psaStrings)
return;
BSTR bstr = SysAllocString(html);
if (bstr)
{
VARIANT* param;
HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)¶m);
if (SUCCEEDED(hr))
{
param->vt = VT_BSTR;
param->bstrVal = bstr;
hr = SafeArrayUnaccessData(psaStrings);
if (SUCCEEDED(hr))
{
doc1->write(psaStrings);
doc1->close();
}
}
}
// SafeArrayDestroy calls SysFreeString for each BSTR!
if (psaStrings)
SafeArrayDestroy(psaStrings);
}
您还应该将浏览器控件添加到您的 .rs 文件中
控制 "",IDC_SGWEBBROWSER,"{8856F961-340A-11D0-A96B-00C04FD705A2}",WS_TABSTOP,388,36,236,281
在实现它的几种方法中,我发现基于坐标创建一个临时 HTML 并调用:m_Browser.Navigate(FileName, 0, 0, 0, 0);
是最好的。
“文件名”是根据地图上点的请求坐标创建的,其他属性如下:
为“FileName”分配名称和路径:
wchar_t FileName[2048];
GetCurrentDirectory(2048, FileName);
wcscat(FileName, L"\\test.html");
用数据填充文件并使用浏览器控件打开它,同时将谷歌地图导航到请求的位置:
变量:
一个。纬度
湾。经度
C。缩放(设置为 10)
d。API 密钥。(您需要获得一份)
代码( WriteHTML函数的替代方法)
CString HTML_TEXT;
CRect rect;
CWnd *pWnd = GetDlgItem(IDC_SGWEBBROWSER);
pWnd->GetWindowRect(&rect);
int w = rect.Width()-50, h = rect.Height()-50;
HTML_TEXT.Format(L"<!DOCTYPE html><html><meta http-equiv=\"X - UA - Compatible\" content=\"IE = edge\"><body><div id =\"googleMap\" style=\"width:%dpx;height:%dpx\"><script>function myMap(){var mapProp = {center:new google.maps.LatLng(%f, %f), zoom : 10};var map = new google.maps.Map(document.getElementById(\"googleMap\"), mapProp);marker = new google.maps.Marker({position: new google.maps.LatLng(%f, %f),map: map});}</script><script src = \"https://maps.googleapis.com/maps/api/js?key=%s&callback=myMap\"></script></div></body></html>", w, h, Latitude, Longitude, Latitude, Longitude, API_KEY);
FILE *fp = _wfopen(FileName, L"w");
fwprintf(fp, L"%s", HTML_TEXT.GetBuffer());
fclose(fp);
m_Browser.Navigate(FileName, 0, 0, 0, 0);