3

我们希望将 Google 地图集成到我们的 C/C++ win32 应用程序中。整个想法是当用户第一次运行应用程序时,我们要求他们标记他们的位置,然后检索用户选择位置的坐标并保存到数据库或文件中。

初始化后,我们希望为用户提供一些预先标记的位置,并允许用户找到从他们的位置到那个位置的方向。将提供预标记位置的坐标。

是否可以通过使用 Google Api 来实现我们想要的,如果可以,那么如何实现?如果有关于它的法律问题?

谢谢。

4

3 回答 3

1

对于法律问题的答案,最好的地方是查看服务条款,然后当然咨询律师。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/ - 那里提供的地理编码数据包含在开放数据库许可证下,该许可证允许使用归属地。

http://wiki.openstreetmap.org/wiki/Legal_FAQ

于 2012-09-28T15:10:18.313 回答
0

您可以在 Windows 上使用 Qt 框架。您可以将您的 win32 应用程序与 Qt 集成。在 Qt 中,您可以使用QWebKit框架与您的应用程序和网页(在这种情况下是包含来自 Google 地图的地图的页面)进行通信。实际上,您可以使用 Qt 编写混合应用程序。查看 Qt QWebKit文档。

于 2012-09-28T11:02:38.720 回答
0

我需要同样的,并通过浏览器对象连接谷歌地图来解决它。

*** 请阅读有关WebBrowser 控件兼容性的信息并按照说明进行操作。

  1. 创建一个基于MFC对话框的项目。

  2. 添加一个 CExplorer 控件。(参见:https ://msdn.microsoft.com/en-us/library/aa752046(v=vs.85).aspx )。

  3. 当你的程序的主对话框初始化时,你需要初始化一个全局对象

     CExplorer1 m_Browser;
    
  4. 第一个构建块是 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*)&param);
    
           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);
     }
    
  5. 您还应该将浏览器控件添加到您的 .rs 文件中

    控制 "",IDC_SGWEBBROWSER,"{8856F961-340A-11D0-A96B-00C04FD705A2}",WS_TABSTOP,388,36,236,281

  6. 在实现它的几种方法中,我发现基于坐标创建一个临时 HTML 并调用:m_Browser.Navigate(FileName, 0, 0, 0, 0); 是最好的。

  7. “文件名”是根据地图上点的请求坐标创建的,其他属性如下:

  8. 为“FileName”分配名称和路径:

      wchar_t FileName[2048];
    
      GetCurrentDirectory(2048, FileName);
    
      wcscat(FileName, L"\\test.html");
    
  9. 用数据填充文件并使用浏览器控件打开它,同时将谷歌地图导航到请求的位置:

变量:

一个。纬度

湾。经度

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);
于 2018-01-15T21:24:11.827 回答