大疆上云API源码解析(航线管理)

本文详细描述了Pilot2的航线管理功能,包括文件的上传、下载、编辑、列表展示以及与云端同步。介绍了获取临时凭证、文件列表获取、下载地址获取、重复名称检查和文件上传结果上报等关键接口。
摘要由CSDN通过智能技术生成

航线管理

Pilot2

功能概述

主要是提供同一个工作空间下的航线文件下载上传,用户通过Pilot2登录到服务端后,可以拉取航线列表,显示在Pilot2的航线库中,Pilot2 可以直接查看云端的航线,如果要修改航线,需要先将航线下载到本地,然后进行编辑,本地编辑不影响云端航线,如果需要将修改后的航线共享,则需要将航线重新命名,然后再次上传。

接口说明
  1. 获取上传临时凭证
    每次航线文件上传时,需要向服务端获取临时文件上传凭证,Pilot2在上传时会带上该凭证用于校验
    com.zdjjrj.storage.controller.StorageController#getTemporaryCredential
	@Override
    public HttpResultResponse<StsCredentialsResponse> getTemporaryCredential(String workspaceId, HttpServletRequest req, HttpServletResponse rsp) {
        StsCredentialsResponse stsCredentials = storageService.getSTSCredentials();
        return HttpResultResponse.success(stsCredentials);
    }

com.zdjjrj.storage.service.impl.StorageServiceImpl#getSTSCredentials

@Service
public class StorageServiceImpl extends AbstractMediaService implements IStorageService {

    @Autowired
    private OssServiceContext ossService;

    @Override
    public StsCredentialsResponse getSTSCredentials() {
        return new StsCredentialsResponse()
                .setEndpoint(OssConfiguration.endpoint)
                .setBucket(OssConfiguration.bucket)
                .setCredentials(ossService.getCredentials())
                .setProvider(OssConfiguration.provider)
                .setObjectKeyPrefix(OssConfiguration.objectDirPrefix)
                .setRegion(OssConfiguration.region);
    }

    @Override
    public TopicRequestsResponse<MqttReply<StsCredentialsResponse>> storageConfigGet(TopicRequestsRequest<StorageConfigGet> response, MessageHeaders headers) {
        return new TopicRequestsResponse<MqttReply<StsCredentialsResponse>>().setData(MqttReply.success(getSTSCredentials()));
    }
}
  1. 获取航线文件列表
    DJI Pilot 2通过http向服务端拉取航线文件列表,并显示在DJI Pilot 2航线库中
    com.zdjjrj.sdk.cloudapi.wayline.api.IHttpWaylineService.getWaylineList

    @Override
    public HttpResultResponse<PaginationData<GetWaylineListResponse>> getWaylineList(@Valid GetWaylineListRequest request, String workspaceId, HttpServletRequest req, HttpServletResponse rsp) {
        PaginationData<GetWaylineListResponse> data = waylineFileService.getWaylinesByParam(workspaceId, request);
        return HttpResultResponse.success(data);
    }
    

    com.zdjjrj.wayline.service.impl.WaylineFileServiceImpl#getWaylinesByParam

    @Override
    public PaginationData<GetWaylineListResponse> getWaylinesByParam(String workspaceId, GetWaylineListRequest param) {
        // Paging Query
        Page<WaylineFileEntity> page = mapper.selectPage(
                new Page<WaylineFileEntity>(param.getPage(), param.getPageSize()),
                new LambdaQueryWrapper<WaylineFileEntity>()
                        .eq(WaylineFileEntity::getWorkspaceId, workspaceId)
                        .eq(Objects.nonNull(param.getFavorited()), WaylineFileEntity::getFavorited, param.getFavorited())
                        .like(Objects.nonNull(param.getJobName()), WaylineFileEntity::getName, param.getJobName())
                        .ge(Objects.nonNull(param.getStartTime()), WaylineFileEntity::getCreateTime, param.getStartTime())
                        .le(Objects.nonNull(param.getEndTime()), WaylineFileEntity::getCreateTime, param.getEndTime())
                        .and(param.getTemplateType() != null, wrapper ->  {
                                for (WaylineTypeEnum type : param.getTemplateType()) {
                                    wrapper.like(WaylineFileEntity::getTemplateTypes, type.getValue()).or();
                                }
                        })
                        // There is a risk of SQL injection
                        .last(StringUtils.hasText(param.getOrderBy()), " order by " + param.getOrderBy()));
    
        // Wrap the results of a paging query into a custom paging object.
        List<GetWaylineListResponse> records = page.getRecords()
                .stream()
                .map(this::entityConvertToDTO)
                .collect(Collectors.toList());
    
        return new PaginationData<>(records, new Pagination(page));
    }
    
  2. 获取航线文件下载地址
    当用户点击下载DJI Pilot 2中航线列表的某个航线时,DJI Pilot 2会发起获取航线下载地址的请求。
    com.zdjjrj.wayline.controller.WaylineFileController#getWaylineFileDownloadAddress

    @Override
    public void getWaylineFileDownloadAddress(String workspaceId, String waylineId, HttpServletRequest req, HttpServletResponse rsp) {
        try {
            URL url = waylineFileService.getObjectUrl(workspaceId, waylineId);
            rsp.sendRedirect(url.toString());
    
        } catch (IOException | SQLException e) {
            e.printStackTrace();
        }
    }
    

    com.zdjjrj.wayline.service.impl.WaylineFileServiceImpl#getObjectUrl

     @Override
    public URL getObjectUrl(String workspaceId, String waylineId) throws SQLException {
        Optional<GetWaylineListResponse> waylineOpt = this.getWaylineByWaylineId(workspaceId, waylineId);
        if (waylineOpt.isEmpty()) {
            throw new SQLException(waylineId + " does not exist.");
        }
        return ossService.getObjectUrl(OssConfiguration.bucket, waylineOpt.get().getObjectKey());
    }
     @Override
        public Optional<GetWaylineListResponse> getWaylineByWaylineId(String workspaceId, String waylineId) {
            return Optional.ofNullable(
                    this.entityConvertToDTO(
                            mapper.selectOne(
                                    new LambdaQueryWrapper<WaylineFileEntity>()
                                        .eq(WaylineFileEntity::getWorkspaceId, workspaceId)
                                        .eq(WaylineFileEntity::getWaylineId, waylineId))));
        }
    
  3. 获取重复的航线文件名称
    DJI Pilot 2在本地编辑和上传的航线文件中,不允许有重复的航线名称存在,所以在上传航线文件时,需要先调用该接口,检查是否存在重复的航线文件名称,如果存在重复的航线文件名称,则会弹窗提示用户重命名航线文件名称。
    com.zdjjrj.wayline.controller.WaylineFileController#getDuplicatedWaylineName

     @Override
    public HttpResultResponse<List<String>> getDuplicatedWaylineName(String workspaceId, @NotNull @Size(min = 1) List<String> names, HttpServletRequest req, HttpServletResponse rsp) {
        List<String> existNamesList = waylineFileService.getDuplicateNames(workspaceId, names);
    
        return HttpResultResponse.success(existNamesList);
    }
    

    com.zdjjrj.wayline.service.impl.WaylineFileServiceImpl#getDuplicateNames

    @Override
    public List<String> getDuplicateNames(String workspaceId, List<String> names) {
        return mapper.selectList(new LambdaQueryWrapper<WaylineFileEntity>()
                .eq(WaylineFileEntity::getWorkspaceId, workspaceId)
                .in(WaylineFileEntity::getName, names))
                .stream()
                .map(WaylineFileEntity::getName)
                .collect(Collectors.toList());
    }
    
    
  4. 航线文件上传结果上报
    航线文件上传到对象存储服务以后,DJI Pilot 2会把上传结果上报给服务端,服务端对该结果进行相应的业务操作。
    com.zdjjrj.wayline.controller.WaylineFileController#fileUploadResultReport

    @Override
    public HttpResultResponse fileUploadResultReport(String workspaceId, @Valid WaylineUploadCallbackRequest request, HttpServletRequest req, HttpServletResponse rsp) {
        CustomClaim customClaim = (CustomClaim)req.getAttribute(TOKEN_CLAIM);
    
        WaylineUploadCallbackMetadata metadata = request.getMetadata();
    
        WaylineFileDTO file = WaylineFileDTO.builder()
                .username(customClaim.getUsername())
                .objectKey(request.getObjectKey())
                .name(request.getName())
                .templateTypes(metadata.getTemplateTypes().stream().map(WaylineTypeEnum::getValue).collect(Collectors.toList()))
                .payloadModelKeys(metadata.getPayloadModelKeys().stream().map(DeviceEnum::getDevice).collect(Collectors.toList()))
                .droneModelKey(metadata.getDroneModelKey().getDevice())
                .build();
    
        int id = waylineFileService.saveWaylineFile(workspaceId, file);
    
        return id <= 0 ? HttpResultResponse.error() : HttpResultResponse.success();
    }
    
  5. 批量收藏航线文件

    当用户需要特别关注某几个航线文件时,可以点击收藏,同时,通过该接口可以标记需要收藏的航线文件与该用户的绑定关系。
    com.zdjjrj.wayline.controller.WaylineFileController#batchFavoritesWayline

    @Override
    public HttpResultResponse batchFavoritesWayline(String workspaceId, @NotNull @Size(min = 1) List<String> ids, HttpServletRequest req, HttpServletResponse rsp) {
        boolean isMark = waylineFileService.markFavorite(workspaceId, ids, true);
    
        return isMark ? HttpResultResponse.success() : HttpResultResponse.error();
    }
    
    
  6. 批量取消收藏航线文件
    同上功能,取消航线文件与用户的收藏绑定关系。
    com.zdjjrj.wayline.controller.WaylineFileController#batchUnfavoritesWayline

     @Override
    public HttpResultResponse batchUnfavoritesWayline(String workspaceId, @NotNull @Size(min = 1) List<String> ids, HttpServletRequest req, HttpServletResponse rsp) {
        boolean isMark = waylineFileService.markFavorite(workspaceId, ids, false);
    
        return isMark ? HttpResultResponse.success() : HttpResultResponse.error();
    }
    
  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Cesium和大疆设置航线时,你需要准备以下软件: 1. DJI Pilot:用于大疆无人机飞行规划,可以免费使用。 2. ContextCapture(CC):用于三维建模。 3. Cesiumlab3:用于载入三维模型。 在软件准备完成后,你可以按照以下步骤设置航线: 1. 打开DJI Pilot应用程序,选择航线规划功能。 2. 根据需要设置航线的起点和终点,并调整航线的路径和飞行高度等参数。 3. 设置完成后,保存航线设置,然后调用航线执行。 4. 在执行航线之前,你可以选择执行的航线数量,选择越多的航线可以提高后期建模的精度。 5. 上传航线后,可以点击“开始飞行”执行任务。 6. 在飞行过程中,你可以使用地图视图和相机视图进行实时监测。 7. 如果电量低,无人机会自动返航,及时更换电池。 这些步骤可以帮助你在Cesium和大疆中设置航线并执行任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [DJI Pilot无人机航线规划-实景三维建模全流程](https://blog.csdn.net/weixin_53403190/article/details/128531718)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值