跳到正文
W Winse Blog
mobile dev 3 min read

Conjure实战:对接高德导航 API(驾车导航)

本文介绍如何结合高德地图 API 与 Conjure,快速搭建一个支持路径导航的地图。

这里使用高德的驾车导航 https://lbs.amap.com/api/webservice/guide/api/direction#t6 。然后使用leaflet在地图上显示导航路径。

# 导航的 Conjure API

先让AI来筛两遍:首先把文档给到AI,让它提取参数和接口。

用AI读取文档提取参数

AI整理后的yml

然后给一个实际的配置,让它学习后,把上面的配置转成模版的格式。Prompt: 学习hello.yml的定义方式,把amap-direction.yml按照hello.yml的格式去修正

对照学习后,AI生成的配置已经基本可用了

最后,人工对照修订一下,就有了下面的 高德驾车导航Conjure API 配置文件:

types:
  definitions:
    default-package: com.amap.api.direction
    objects:
      DrivingDirectionResponse:
        fields:
          status: string
          info: string
          count: optional<string>
          route: Route

      Route:
        fields:
          origin: string
          destination: string
          taxi_cost: string
          paths: list<Path>

      Path:
        fields:
          path: string
          distance: string
          duration: string
          strategy: string
          tolls: string
          restriction: string
          traffic_lights: string
          tolls_distance: string
          steps: list<Step>

      Step:
        fields:
          instruction: string
          orientation: string
          road: string
          distance: string
          tolls: string
          toll_distance: string
          toll_road: string
          polyline: string
          action: string
          assistant_action: string
          tmcs: list<Tmcs>
          cities: list<Cities>

      Tmcs:
        fields:
          distance: string
          status: string
          polyline: string

      Cities:
        fields:
          name: string
          citycode: string
          adcode: string
          districts: list<Districts>

      Districts:
        fields:
          name: string
          adcode: string

services:
AmapDirectionService:
    name: AmapDirection
    package: com.amap.api.direction
    base-path: /v3/direction
    docs:|
      APIs for Amap driving direction

    endpoints:
      driving:
        http: GET/driving
        args:
          key:
            param-type: query
            type: string
          origin:
            param-type: query
            type: string
          destination:
            param-type: query
            type: string
          originid:
            param-type: query
            type: optional<string>
          destinationid:
            param-type: query
            type: optional<string>
          destinationtype:
            param-type: query
            type: optional<string>
          strategy:
            param-type: query
            type: optional<string>
          waypoints:
            param-type: query
            type: optional<string>
          avoidpolygons:
            param-type: query
            type: optional<string>
          province:
            param-type: query
            type: optional<string>
          number:
            param-type: query
            type: optional<string>
          cartype:
            param-type: query
            type: optional<integer>
          ferry:
            param-type: query
            type: optional<integer>
          roadaggregation:
            param-type: query
            type: optional<string>
          nosteps:
            param-type: query
            type: optional<string>
          sig:
            param-type: query
            type: optional<string>
          output:
            param-type: query
            type: optional<string>
            docs: "可选值:JSON,XML"
          callback:
            param-type: query
            type: optional<string>
          extensions:
            param-type: query
            type: string
            docs: "base:返回基本信息;all:返回全部信息"
        returns: DrivingDirectionResponse
		

# 导航工程搭建

先用AI生成工程。Prompt:创建一个map-api的gradle工程,下面包括amap-api的子工程,在amap-api下面创建文件src/main/conjure/amap-direction.yml。gradle配置保持最简单,只配置必须的配置。

然后配置gradle:

settings.gradle

include ':amap-api'
include ':amap-api:amap-api-objects'
include ':amap-api:amap-api-typescript'

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath'com.palantir.gradle.conjure:gradle-conjure:5.10.0'
    }
}

allprojects {
    repositories {
        mavenCentral()
    }
}

apply plugin: 'com.palantir.conjure'

// 需要定义在rootProject, 指定依赖的版本号
configurations {
    conjureCompiler
    conjureJava
    conjureTypeScript
}
dependencies {
    conjureCompiler 'com.palantir.conjure:conjure:4.16.1'
    conjureJava 'com.palantir.conjure.java:conjure-java:6.5.0'
    conjureTypeScript 'com.palantir.conjure.typescript:conjure-typescript:5.4.0'
}

subprojects {
    apply plugin: 'java-library'
    apply plugin: 'com.palantir.conjure'
    
    sourceCompatibility = 11
    targetCompatibility = 11
    
    compileJava { options.encoding = "UTF-8" }
    
    conjure {
        typescript { version = "0.0.1" }

        java { useImmutableBytes = true }
    }
    
    dependencies {
        implementation "com.palantir.conjure.java:conjure-lib:6.5.0"
    }
}

使用 Conjure 生成 TypeScript 代码:

set PATH=D:\node-v20.13.1-win-x64;E:\local\gradle-8.13\bin;C:\Java\jdk-11.0.12\bin;%PATH%
gradle compileConjure

# 网页地图

使用设想:首先在leaflet地图上选择两个点,然后请求高德导航接口,根据返回的数据把导航路径画出来。

还是先让AI给我们生成基础的工程。Prompt:创建一个地图web工程,使用react和leaflet来实现,用typescript语言编写。主界面左上角是两个输入框用于分别输入出发地和目的地,输入框右边有按钮实现地图选择地址的功能。查询服务后返回结果在输入框中显示结果,通过路线在leaflet中画出来。

然后调整完善。地图交互代码已经准备好了,画点和路径的参数都已经预留了,只需绑定数据就可以把导航路径画出来了。

添加amap-api的依赖。conjure-client 这里需要修改一下header,同样使用本地链接的方式添加依赖:

"dependencies":{
    "conjure-client":"link:../conjure-client/",
    "amap-api":"link:../amap-api/amap-api-typescript/src/",
    "react":"^17.0.2",
    "react-dom":"^17.0.2",
    "react-scripts":"5.0.1",
    "leaflet":"^1.7.1",
    "react-leaflet":"^3.2.1",
    "typescript":"^4.1.2"
},
"devDependencies":{
    "@types/react":"^17.0.0",
    "@types/react-dom":"^17.0.0",
    "@types/leaflet":"^1.7.1"
},

当起始点和终点变更时查询导航接口。

请求高德导航接口成功后,通过解析返回的 polyline 路径字段为LatLng对象。

生成模型后,写代码的时刻就有提示了。

把解析的结果传给地图组件 MapView,实现路径绘制。最终效果:

#  反思

主要时间都花在leaflet上面了。写 Conjure API和对接方面的还是很快的。

如果需要用到接口中比较多的参数 时,用代码生成的方式来构建接口调用还是不错的选择的。编写调用接口的代码时,有代码的提示,还可以做一些辅助工作让接口使用更方便。一整套的方法积累完善后,未来其他接口可以方便的复用。

在 GitHub 上讨论

欢迎通过 GitHub Issue 留言或反馈。每条讨论都会关联到对应文章的源文件路径。

2025-07-21-Conjure实战:对接高德导航-API(驾车导航).md

Related posts