delphi EdgeBrowser调用天地图API

请教,如何使用delphi EdgeBrowser调用天地图API,网上列子是多,但都无法编译通过。API的秘匙我有了。
请指点迷津,提供关键代码的详细说明。
HTML 和 Javscript 天地图官网给出源码了,但是我不知道这么使用它。
特别是如何调用HTML 和 Javscript 。
这2个文件最好采用外部调用方式,我不想把HTML 和 Javscript程序写在delphi var 哪里。

首先,你需要使用Delphi的TWebBrowser组件以及相应的WebBrowserEvents组件来加载和操作HTML页面。

在Delphi中,你可以通过使用TWebBrowser组件中的"Navigate"方法来加载天地图API的HTML页面,如下所示:

WebBrowser1.Navigate('file://c:/天地图API的HTML文件路径/天地图API.html');

在加载HTML页面之后,你可以通过使用TWebBrowser组件中的"Document"属性来获取HTML页面中的DOM元素,如下所示:

var
  Element: OleVariant;
begin
  Element := WebBrowser1.Document.getElementById('element-id');
  if not VarIsNull(Element) then
  begin
    // 对DOM元素进行操作
  end;
end;

需要注意的是,在进行操作之前,你需要等待页面完全加载完成。你可以通过捕获WebBrowserEvents组件中的"OnDocumentComplete"事件来确定页面是否已经加载完成,如下所示:

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  // 页面已经加载完成
end;

对于如何使用天地图API的JavaScript进行操作,你可以通过在Delphi中进行外部调用来实现。你可以使用TWebBrowser组件中的"Document"属性获取页面中嵌入的JavaScript代码,并在Delphi代码中执行它,如下所示:

var
  Script: OleVariant;
begin
  Script := WebBrowser1.Document.parentWindow.execScript('javascript-code');
end;

在这里,"javascript-code"是你要执行的JavaScript代码。

最后,你可以在JavaScript代码中调用API并传入API的秘钥,如下所示:

<script type="text/javascript">
    var map = new T.Map("mapDiv");
    map.centerAndZoom(new T.LngLat(116.40769, 39.89945), 18);
    map.addControl(new T.Control.Scale());
    map.addControl(new T.Control.Zoom());
    map.addControl(new T.Control.LayerSwitcher());
    map.addOverLay(new T.Marker(new T.LngLat(116.40769, 39.89945)));
    var url = "http://t{s}.tianditu.com/DataServer?T=vec_w&x={x}&y={y}&l={z}";
    var subdomains = ["0", "1", "2", "3", "4", "5", "6", "7"];
    var tileLayer = new T.TileLayer(url, {subdomains: subdomains});
    map.addLayer(tileLayer);
    tileLayer.getTilesUrl=function(){

        var curMap = map.getZoom();
        if(curMap<=10){
            url = "http://t{s}.tianditu.com/DataServer?T=vec_w&x={x}&y={y}&l={z}";
            return url;
        }
        else if(curMap>10&&curMap<=14){
            url = "http://t{s}.tianditu.com/DataServer?T=cva_w&x={x}&y={y}&l={z}";
            return url;
        }
        else{
            url = "http://t{s}.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}";
            return url;
        }
    }
    tileLayer.getTileUrl=function(){
        var curMap = map.getZoom();
        if(curMap<=10){
            url = "http://t{s}.tianditu.com/DataServer?T=vec_w&x={x}&y={y}&l={z}";
            return url;
        }
        else if(curMap>10&&curMap<=14){
            url = "http://t{s}.tianditu.com/DataServer?T=cva_w&x={x}&y={y}&l={z}";
            return url;
        }
        else{
            url = "http://t{s}.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}";
            return url;
        }
    }
    tileLayer.preload=function(){
        tileLayer._preLoadTiles();
    };
</script>

在这里,你可以将秘钥传入API的请求中,如下所示:

var url = "http://t{s}.tianditu.com/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=Your-key";

首先,需要在Delphi中添加EdgeBrowser控件。可以使用TWebBrowser或TChromium控件,或者使用第三方控件。

接下来,需要在Delphi中编写调用天地图API的代码。可以通过调用JavaScript代码来实现。

假设你已经有了天地图API的秘钥,并且已经编写好了HTML和JavaScript代码。以下是Delphi代码示例:

procedure TForm1.FormCreate(Sender: TObject);
begin
  //设置EdgeBrowser控件的Options,以允许JavaScript代码的执行
  WebBrowser1.Options.ScriptingEnabled := True;
  
  //加载HTML文件
  WebBrowser1.Navigate('file:///C:/path/to/your/html/file.html');
end;

procedure TForm1.WebBrowser1DocumentCompleted(Sender: TObject; const pDisp: IDispatch; const URL: OleVariant);
var
  script: IHTMLScriptElement;
  jsCode: WideString;
begin
  //执行JavaScript代码
  jsCode := 'var token = "your_token_here";' + #13#10 +
            'var map = new T.Map("map");' + #13#10 +
            'map.centerAndZoom(new T.LngLat(116.40769, 39.89945), 15);' + #13#10 +
            'var layer = new T.TileLayer({"urlTemplate":"http://t{0-7}.tianditu.com/DataServer?T=vec_c&X={x}&Y={y}&L={z}&token="+token});' + #13#10 +
            'map.addLayer(layer);';
  script := (WebBrowser1.Document as IHTMLDocument2).createElement('script') as IHTMLScriptElement;
  script.text := jsCode;
  (WebBrowser1.Document as IHTMLDocument2).getElementsByTagName('head').item(0).appendChild(script as IHTMLDOMNode);
end;

以上代码假设天地图API的HTML文件位于本地磁盘上的C:/path/to/your/html/file.html文件中,并且其中包含了调用天地图API的JavaScript代码。

在WebBrowser1DocumentCompleted方法中,使用JavaScript代码创建了一个T.Map对象,并向其中添加了一个T.TileLayer图层。T.TileLayer的"URLTemplate"属性指向了天地图API的服务地址,并在URL中包含了秘钥,以便进行身份验证。在这个示例中,秘钥直接硬编码在JavaScript代码中,但更好的方式是使用Delphi代码将秘钥传递给JavaScript代码。

需要注意的是,天地图API的服务地址可能会发生变化,因此需要及时更新"URLTemplate"属性中的URL。此外,不同类型的地图服务对应的URL也可能不同,需要根据实际情况进行调整。

希望这个示例能帮助你成功调用天地图API。
如果有帮助,点个采纳,感谢

这里面是两个问题:
1、delphi 调用 EdgeBrowser,这一步你应该没问题吧?
2、天地图API调用。这是纯前端的问题,你可以单独写个html用系统内置浏览器打开测试。

<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
<script src="https://ditu.zjzwfw.gov.cn/docs/vectormap/js/leaflet/CustomWebSDK.min.js"></script>

将这两个文件引入index.html中就可以了
还要就是在引入function init(){}时,官网是没有将token拼接在引入地址后面的,我们在引入的时候要在https://ditu.zjzwfw.gov.cn/mapserver/vmap/zjvmap/getMAP?x={x}&y={y}&l={z}&styleId=tdt_biaozhunyangshi_2017hou拼接上 &token='你的token'。

基于new bing部分指引作答:
使用Delphi中的EdgeBrowser组件调用天地图API可以实现在Delphi应用程序中显示天地图的功能。您可以通过以下步骤进行操作:

1、创建一个新的Delphi应用程序项目。

2、在设计时,将TEdgeBrowser组件放置在窗体上。您可以在"Component Palette"中的"Samples"选项卡中找到TEdgeBrowser组件。

3、在代码编辑器中,添加System.Win.ComObj单元,以便使用COM对象。

4、在窗体的OnCreate事件中,通过以下代码创建并加载天地图的HTML页面:

uses
  System.Win.ComObj;

procedure TForm1.FormCreate(Sender: TObject);
var
  Document: OleVariant;
  HTML: OleVariant;
begin
  EdgeBrowser1.Navigate('about:blank'); // 加载空白页面

  // 获取HTML文档对象
  Document := EdgeBrowser1.DefaultInterface.Document;

  // 创建并设置HTML内容
  HTML := VarArrayCreate([0, 0], varVariant);
  HTML[0] := '<html><head><script src="https://api.tianditu.gov.cn/api?v=4.0&tk=您的密钥"></script></head><body></body></html>';
  Document.Write(HTML);

  // 加载HTML内容
  Document.Close;
end;

5、请确保将代码中的您的密钥替换为您在天地图API网站上获得的实际密钥。

然后,您可以通过执行JavaScript代码与天地图API进行交互。例如,以下代码在Delphi中调用JavaScript函数以显示地图:

procedure TForm1.FormCreate(Sender: TObject);
var
  Document: OleVariant;
  HTML: OleVariant;
begin
  // ...

  // 加载天地图的HTML页面
  // ...

  // 调用JavaScript函数显示地图
  Document := EdgeBrowser1.DefaultInterface.Document;
  Document.parentWindow.execScript('showMap()', 'JavaScript');
end;

这里的showMap()是您在天地图API提供的JavaScript代码中定义的函数。

通过这种方式,您可以在Delphi应用程序中使用Delphi EdgeBrowser组件调用天地图API,并在HTML和JavaScript中编写和调用相关功能。

天地图里有教程的啊

头部分:

<head>
    <title>天地图三维服务接入</title>
    <!cesium版本:1.58>
    <script src="/Cesium-1.83/Build/CesiumUnminified/Cesium.js"></script>
    <!cesium扩展插件>
    <script src="http://api.tianditu.gov.cn/cdn/plugins/cesium/cesiumTdt.js" ></script>
    <!cesium样式文件>
    <link rel="stylesheet" type="https://cesium.com/downloads/cesiumjs/releases/1.69/Build/Cesium/Widgets/widgets.css" /> 
    <style></style>

JS主程序部分:
<script>
    var token = '我的秘匙';
    // 服务域名
    var tdtUrl = 'https://t{s}.tianditu.gov.cn/';
    // 服务负载子域
    var subdomains=['0','1','2','3','4','5','6','7'];

    // cesium 初始化
    var viewer = new Cesium.Map('cesiumContainer', {
        shouldAnimate: true,
        selectionIndicator:true,
        infoBox:false
    });

    // 叠加影像服务
    var imgMap = new Cesium.UrlTemplateImageryProvider({
        url: tdtUrl + 'DataServer?T=img_w&x={x}&y={y}&l={z}&tk=' + token,
        subdomains: subdomains,
        tilingScheme : new Cesium.WebMercatorTilingScheme(),
        maximumLevel : 18
    });
    viewer.imageryLayers.addImageryProvider(imgMap); 

    // 叠加国界服务
    var iboMap = new Cesium.UrlTemplateImageryProvider({
        url: tdtUrl + 'DataServer?T=ibo_w&x={x}&y={y}&l={z}&tk=' + token,
        subdomains: subdomains,
        tilingScheme : new Cesium.WebMercatorTilingScheme(),
        maximumLevel : 10
    });
    viewer.imageryLayers.addImageryProvider(iboMap);

    // 叠加地形服务
    var terrainUrls = new Array();

    for (var i = 0; i < subdomains.length; i++){
        var url = tdtUrl.replace('{s}', subdomains[i]) + 'DataServer?T=elv_c&tk=' + token;
        terrainUrls.push(url);
    }

    var provider = new Cesium.GeoTerrainProvider({
        urls: terrainUrls
    });

    viewer.terrainProvider = provider;

    // 将三维球定位到中国
    viewer.camera.flyTo({
        destination: Cesium.Cartesian3.fromDegrees(103.84, 31.15, 17850000),
        orientation: {
            heading :  Cesium.Math.toRadians(348.4202942851978),
            pitch : Cesium.Math.toRadians(-89.74026687972041),
            roll : Cesium.Math.toRadians(0)
        },
        complete:function callback() {
            // 定位完成之后的回调函数
        }
    });

    // 叠加三维地名服务
    var wtfs = new Cesium.GeoWTFS({
        viewer,
        subdomains:subdomains,
        metadata:{
            boundBox: {
                minX: -180,
                minY: -90,
                maxX: 180,
                maxY: 90
            },
            minLevel: 1,
            maxLevel: 20
        },
        aotuCollide: true, //是否开启避让
        collisionPadding: [5, 10, 8, 5], //开启避让时,标注碰撞增加内边距,上、右、下、左
        serverFirstStyle: true, //服务端样式优先
        labelGraphics: {
            font:"28px sans-serif",
            fontSize: 28,
            fillColor:Cesium.Color.WHITE,
            scale: 0.5,
            outlineColor:Cesium.Color.BLACK,
            outlineWidth: 5,
            style:Cesium.LabelStyle.FILL_AND_OUTLINE,
            showBackground:false,
            backgroundColor:Cesium.Color.RED,
            backgroundPadding:new Cesium.Cartesian2(10, 10),
            horizontalOrigin:Cesium.HorizontalOrigin.MIDDLE,
            verticalOrigin:Cesium.VerticalOrigin.TOP,
            eyeOffset:Cesium.Cartesian3.ZERO,
            pixelOffset:new Cesium.Cartesian2(0, 8)
        },
        billboardGraphics: {
            horizontalOrigin:Cesium.HorizontalOrigin.CENTER,
            verticalOrigin:Cesium.VerticalOrigin.CENTER,
            eyeOffset:Cesium.Cartesian3.ZERO,
            pixelOffset:Cesium.Cartesian2.ZERO,
            alignedAxis:Cesium.Cartesian3.ZERO,
            color:Cesium.Color.WHITE,
            rotation:0,
            scale:1,
            width:18,
            height:18
        }
    });

    //三维地名服务,使用wtfs服务
    wtfs.getTileUrl = function(){
        return tdtUrl + 'mapservice/GetTiles?lxys={z},{x},{y}&tk='+ token; 
    }

    wtfs.getIcoUrl = function(){
        return tdtUrl + 'mapservice/GetIcon?id={id}&tk='+ token;
    }

    wtfs.initTDT([{"x":6,"y":1,"level":2,"boundBox":{"minX":90,"minY":0,"maxX":135,"maxY":45}},{"x":7,"y":1,"level":2,"boundBox":{"minX":135,"minY":0,"maxX":180,"maxY":45}},{"x":6,"y":0,"level":2,"boundBox":{"minX":90,"minY":45,"maxX":135,"maxY":90}},{"x":7,"y":0,"level":2,"boundBox":{"minX":135,"minY":45,"maxX":180,"maxY":90}},{"x":5,"y":1,"level":2,"boundBox":{"minX":45,"minY":0,"maxX":90,"maxY":45}},{"x":4,"y":1,"level":2,"boundBox":{"minX":0,"minY":0,"maxX":45,"maxY":45}},{"x":5,"y":0,"level":2,"boundBox":{"minX":45,"minY":45,"maxX":90,"maxY":90}},{"x":4,"y":0,"level":2,"boundBox":{"minX":0,"minY":45,"maxX":45,"maxY":90}},{"x":6,"y":2,"level":2,"boundBox":{"minX":90,"minY":-45,"maxX":135,"maxY":0}},{"x":6,"y":3,"level":2,"boundBox":{"minX":90,"minY":-90,"maxX":135,"maxY":-45}},{"x":7,"y":2,"level":2,"boundBox":{"minX":135,"minY":-45,"maxX":180,"maxY":0}},{"x":5,"y":2,"level":2,"boundBox":{"minX":45,"minY":-45,"maxX":90,"maxY":0}},{"x":4,"y":2,"level":2,"boundBox":{"minX":0,"minY":-45,"maxX":45,"maxY":0}},{"x":3,"y":1,"level":2,"boundBox":{"minX":-45,"minY":0,"maxX":0,"maxY":45}},{"x":3,"y":0,"level":2,"boundBox":{"minX":-45,"minY":45,"maxX":0,"maxY":90}},{"x":2,"y":0,"level":2,"boundBox":{"minX":-90,"minY":45,"maxX":-45,"maxY":90}},{"x":0,"y":1,"level":2,"boundBox":{"minX":-180,"minY":0,"maxX":-135,"maxY":45}},{"x":1,"y":0,"level":2,"boundBox":{"minX":-135,"minY":45,"maxX":-90,"maxY":90}},{"x":0,"y":0,"level":2,"boundBox":{"minX":-180,"minY":45,"maxX":-135,"maxY":90}}]);

</script>

body部分:
    <div id="cesiumContainer">    
    </div>