openlayer : 地图 : openlayer 加载互联网地图(谷歌地图/天地图) 和 遇到的问题

本文详细介绍了如何使用OpenLayers加载天地图的地图服务,包括电子地图、卫星影像图及文字标注图层。解决了常见问题如权限类型错误、文字标注加载失败及卫星影像图显示异常等,同时提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1、怎么部署地图服务的?

 

2、openlayer 怎么连接 互联网地图? 

 

   互联网地图是不是可以看出服务器是别人的而已,把原本的ip改成别人的ip就可以了。其他的不变?

 

3、报错:418

参考:天地图API及服务接口调用418错误

天地图官网 : https://www.tianditu.gov.cn/

天地图key:https://console.tianditu.gov.cn/api/key

注册好个人账户,并且新建一个应用后,获取对应的key后报错:

http://t0.tianditu.com/DataServer?T=vec_w&X=3&Y=2&L=2&tk=我的key

{"msg":"权限类型错误","resolve":"Key权限类型为:服务端,请使用服务端访问!","code":12}

改为浏览器端的就可以了。

 

天地图问题和解决:


1、文字标注的不知道为什么加不出来。--简单demo的可以。  解决:自己也是傻,居然没认真看json中的配置属性。。。
2、其层次只到18,  19就没有了---。 
解决:天地图官网上的在线电子地图中最大层数也只有18层。【看来就只能这样了。】【在代码中需要设置maxZoom:18】
3、加载卫星地图 
解决:加载好了,也是18层。

还有的问题:


但是加载的卫星影像图的文字图层加载后,在缩放图层的时候,会出现一些显示上的问题。

 

 

参考博客: openlayers5加载天地图影像

完整代码

<!DOCTYPE html>
<html>

<head>
    <title>WMTS</title>
    <link rel="stylesheet" href="../../ropeok/ol.css" type="text/css">
    <link rel="stylesheet" href="../../ropeok/css/main.css" type="text/css">
    <script src="../../jquery.js"></script>
    <script src="../../ropeok/rkol.js"></script>
</head>
<style type="text/css">
    body, #map {
        border: 0px;
        margin: 0px;
        padding: 0px;
        width: 100%;
        height: 100%;
        font-size: 13px;
    }
    #map{
        width:100%;
        height:100%
        border:1px solid red;
    }
</style>
<body>
<div id="map" class="map"></div>
<script>
    var center = ol.proj.transform([118.113775,24.591268], "EPSG:4326", "EPSG:3857");

    var projection = ol.proj.get("EPSG:4326");
    var resolutions = [0.00118973050291514, 5.9486525145757E-4, 2.97432625728785E-4, 1.5228550437313792E-4,7.614275218656896E-5, 3.807137609328448E-5, 1.903568804664224E-5, 9.51784402332112E-6, 4.75892201166056E-6];
    var matrixIds = [0, 1, 2, 3, 4, 5, 6, 7, 8];
    var origin=[-400, 400];
    var tileGrid = new ol.tilegrid.TileGrid({
        origin: origin, //原点(左上角)
        resolutions: resolutions, //分辨率数组
        matrixIds: matrixIds //矩阵标识列表,与地图级数保持一致
    });

    var map = new ol.Map({
        target: 'map',
        layers: [
            new ol.layer.Tile({
                source: new ol.source.XYZ({
                    url: 'http://t2.tianditu.com/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=我的key'
                }),
                isGroup: true,
                name: '天地图路网-电子地图'
            }),
            new ol.layer.Tile({
                // source: new ol.source.XYZ({
                //     url:"http://t2.tianditu.com/DataServer?T="+"cva_w"+"&X={x}&Y={y}&L={z}&tk=" + "我的key"
                // }),
                source: new ol.source.XYZ({
                    url: 'http://t2.tianditu.com/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=我的key'
                }),
                isGroup: true,
                name: '天地图文字标注-电子地图'
            }),
            new ol.layer.Tile({
                source: new ol.source.XYZ({
                    url: 'https://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk=我的key',
                }),
                isGroup: true,
                name: '天地图路网-卫星影像图'
            }),
            new ol.layer.Tile({
                source: new ol.source.XYZ({
                    url: 'https://t0.tianditu.gov.cn/DataServer?T=cia_w&x={x}&y={y}&l={z}&tk=我的key'
                }),
                isGroup: true,
                name: '天地图文字标注--卫星影像图'
            })



    ],

        view: new ol.View({
            center: center,
            zoom: 12
        })
    });
</script>

</body>

</html>

 

 

 

 

 

<think>我们正在使用Qt 5.14来加载在线地图服务(天地图)。根据引用[4],我们可以使用QWebEngineView来加载网页地图天地图提供了在线服务,我们可以通过构造URL来加载天地图。 步骤: 1. 确保项目中已经包含了Qt WebEngine模块。在.pro文件中添加:`QT += webenginewidgets` 2. 在代码中引入必要的头文件。 3. 创建一个QWebEngineView对象,并设置其大小位置。 4. 构造天地图的URL。天地图有多种服务(矢量、影像、地形等),这里以矢量地图为例。 天地图矢量图的URL模板为:`http://t{s}.tianditu.gov.cn/vec_w/wmts?tk=您的密钥` 其中,{s}代表服务器节点(a, b, c等),您需要先申一个密钥(tk)。 注意:在使用天地图服务前,需要去天地图官网(www.tianditu.gov.cn)申密钥。 示例代码: 首先,在界面上放置一个QWebEngineView控件(例如,通过Qt Designer拖放一个QWebEngineView到窗口上,并命名为webEngineView),或者在代码中创建。 下面是一个简单的示例: ```cpp #include <QWebEngineView> #include <QApplication> #include <QMainWindow> int main(int argc, char *argv[]) { QApplication a(argc, argv); QMainWindow window; window.setWindowTitle("天地图示例"); window.resize(800, 600); // 创建QWebEngineView QWebEngineView *view = new QWebEngineView(&window); // 设置天地图URL,需要替换YOUR_TIANDITU_TOKEN为实际申的密钥 QString token = "YOUR_TIANDITU_TOKEN"; // 选择服务器节点,这里使用t0,也可以是t1, t2等 QString url = QString("http://t0.tianditu.gov.cn/vec_w/wmts?tk=%1").arg(token); // 加载地图 view->load(QUrl(url)); view->resize(window.size()); window.setCentralWidget(view); window.show(); return a.exec(); } ``` 但是,上述URL是直接加载WMTS服务的根地址,这通常不会直接显示地图,因为WMTS服务需要按照一定的规则求瓦片。实际上,我们通常使用OpenLayers或Leaflet等JavaScript库来加载天地图。因此,我们可以加载一个本地的HTML文件,该文件中使用JavaScript库来加载天地图。 另一种方法是使用Qt WebChannel与JavaScript交互,但这里我们先给出一个简单的HTML嵌入示例。 我们可以编写一个HTML文件,例如map.html: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>天地图</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/ol@v7.1.0/ol.css" type="text/css"> <script src="https://cdn.jsdelivr.net/npm/ol@v7.1.0/dist/ol.js"></script> </head> <body> <div id="map" style="width:100%; height:100%; position:absolute;"></div> <script> // 天地图矢量图层,需要替换YOUR_TIANDITU_TOKEN var token = "YOUR_TIANDITU_TOKEN"; var vecLayer = new ol.layer.Tile({ source: new ol.source.XYZ({ url: 'http://t0.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=' + token }) }); // 天地图标注图层 var cvaLayer = new ol.layer.Tile({ source: new ol.source.XYZ({ url: 'http://t0.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=' + token }) }); var map = new ol.Map({ layers: [vecLayer, cvaLayer], target: 'map', view: new ol.View({ center: ol.proj.fromLonLat([116.4, 39.9]), // 中心点坐标(经度,纬度),这里以北京为例 zoom: 10 }) }); </script> </body> </html> ``` 然后在Qt中加载这个HTML文件: ```cpp view->load(QUrl::fromLocalFile("path/to/map.html")); ``` 但是,如果不想使用本地HTML文件,也可以在代码中直接设置HTML内容: ```cpp QString htmlContent = R"( <!DOCTYPE html> <html> ... 上面的HTML内容 ... </html> )"; view->setHtml(htmlContent, QUrl::fromLocalFile("")); ``` 注意:将上面的HTML内容中的YOUR_TIANDITU_TOKEN替换为实际密钥。 另外,引用[2]中展示了通过Qt Quick Widgets与JavaScript交互的例子,但我们这里使用的是QWebEngineView,交互方式类似。例如,我们可以通过QWebEngineView的page()来运行JavaScript代码。 总结: 1. 申天地图密钥。 2. 使用QWebEngineView加载包含天地图服务的网页(可以使用本地的HTML文件,或者直接在代码中设置HTML字符串)。 3. 在HTML中使用OpenLayers等库加载天地图。 注意事项: - 确保网络连接正常,并且能够访问天地图服务。 - 注意天地图服务的URL中服务器节点(t0, t1等)的选择,如果某个节点不可用,可以尝试其他节点。 如果遇到跨域问题,可能需要配置WebEngine设置,但天地图服务是支持跨域的。 以上就是在Qt 5.14中加载天地图的基本方法。 相关问题: 1. 如何在Qt中申使用天地图密钥? 2. 除了天地图,Qt还可以加载哪些在线地图服务? 3. 如何在Qt中实现地图的交互(如标记、绘制图形)?</think>### 在QT 5.14中集成天地图服务的实现方法 在QT 5.14中加载天地图服务,主要通过`QWebEngineView`组件实现。以下是详细步骤示例代码: #### 核心步骤 1. **添加依赖模块** 在项目配置文件(.pro)中添加WebEngine支持: ```qmake QT += webenginewidgets ``` 2. **创建地图容器** 使用`QWebEngineView`作为地图显示容器: ```cpp #include <QWebEngineView> #include <QUrl> ``` 3. **构造天地图URL** 天地图标准URL格式(需申密钥): ```cpp QString token = "您的天地图密钥"; // 从tianditu.gov.cn申 QString url = QString("https://t0.tianditu.gov.cn/vec_w/wmts?" "SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&" "LAYER=vec&STYLE=default&TILEMATRIXSET=w&" "FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&" "tk=%1").arg(token); ``` #### 完整示例代码 ```cpp #include <QApplication> #include <QMainWindow> #include <QWebEngineView> #include <QUrl> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建主窗口 QMainWindow window; window.setWindowTitle("QT天地图集成"); window.resize(800, 600); // 创建地图视图 QWebEngineView *mapView = new QWebEngineView(&window); mapView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); // 设置天地图URL(需替换实际token) QString token = "YOUR_TIANDITU_TOKEN"; QString mapUrl = QString("https://t0.tianditu.gov.cn/vec_w/wmts?" "SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&" "LAYER=vec&STYLE=default&TILEMATRIXSET=w&" "FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&" "tk=%1").arg(token); mapView->load(QUrl(mapUrl)); window.setCentralWidget(mapView); window.show(); return app.exec(); } ``` #### 关键注意事项 1. **密钥申** 必须从[天地图官网](https://www.tianditu.gov.cn)服务密钥,替换代码中的`YOUR_TIANDITU_TOKEN` 2. **服务类型选择** 可替换URL中的`LAYER`参数切换地图类型: - 矢量图:`vec_w` - 影像图:`img_w` - 地形图:`ter_w` 3. **坐标参照系** 天地图使用EPSG:4490坐标系(中国大地坐标系),需确保地理坐标转换正确[^4] 4. **性能优化** ```cpp // 启用硬件加速 QWebEngineSettings::globalSettings()->setAttribute( QWebEngineSettings::Accelerated2dCanvasEnabled, true ); ``` #### 交互扩展(参考引用[2]) 添加地图标记示例: ```cpp // 在WebEngineView执行JavaScript命令 void addMarker(QWebEngineView* view, double lng, double lat) { QString js = QString("addMarker(%1, %2)").arg(lng).arg(lat); view->page()->runJavaScript(js); } // 调用示例:在北京添加标记 addMarker(mapView, 116.40, 39.90); ``` > **提示**:实际项目中建议使用Qt的WebChannel实现C++与JavaScript的双向通信,创建更复杂的地图交互功能[^3]。 --- ### 相关问题 1. 如何解决QT WebEngineView加载天地图时的跨域问题? 2. 除了天地图,QT 5.14还支持哪些在线地图服务(如Google Maps/OpenStreetMap)? 3. 如何在QT中实现地图上的自定义图形绘制(如引用[2]中的三角形)? 4. QT 6对WebEngine模块有哪些重要改进?升级时需注意什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值