春节期间烟花爆竹禁燃禁放是保障公共安全、改善空气质量的重要举措,而禁燃政策落地的核心环节之一,是对县域范围内烟花爆竹销售点的精准盘点与动态监管。传统的人工排查方式存在效率低、数据更新不及时、空间位置可视化差等问题,难以满足县域精细化监管的需求。
地理信息系统(GIS)技术能够将空间位置与业务数据深度融合,结合高德地图 API 提供的成熟地理编码与 POI 检索能力,以及 Java 语言的跨平台、高稳定性特性,可以快速搭建一套轻量化的县域烟花销售点盘点系统。本文以新晃侗族自治县为例,验证该技术在基层监管中的实用性,并为同类县域提供可复用的技术方案。
准备工作:接口配置
在高德开放平台注册开发者账号后,需申请 Web 服务 API Key(注意区分「Web 服务」与「前端 JS」Key)。本次实践核心使用高德的 POI 搜索接口(/v5/place/text),用于检索指定区域内的烟花爆竹销售点。
接口定义
我们需要封装一个 HTTP 请求接口,将参数映射到高德 API 规范中。这里使用了自定义注解来简化调用逻辑。
package com.yelang.project.thridinterface;
import com.burukeyou.uniapi.http.annotation.HttpApi;
import com.burukeyou.uniapi.http.annotation.param.QueryPar;
import com.burukeyou.uniapi.http.annotation.request.GetHttpInterface;
import com.burukeyou.uniapi.http.core.response.HttpResponse;
@HttpApi(url = "https://restapi.amap.com/v5")
public interface AmapSearchService {
@GetHttpInterface("/place/text")
public HttpResponse<String> getSearch(
@QueryPar("keywords") String keywords,
@QueryPar("types") String types,
@QueryPar("region") String region,
@QueryPar("page_size") String page_size,
@QueryPar("page_num") String page_num,
@QueryPar("show_fields") String show_fields,
@QueryPar("key") String key);
}
数据获取与解析
基于 UniHttp 实现 HTTP 请求,解析高德返回的 JSON 数据,提取销售点的核心信息(名称、地址、经纬度等)。
在代码实现上,我们采用分页循环的方式抓取所有数据。这里需要注意控制请求频率,避免触发限流,同时处理空结果集的情况。
package com.yelang.project.unihttp;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
org.springframework.beans.factory.annotation.Autowired;
org.springframework.boot.test.context.SpringBootTest;
org.springframework.test.context.junit4.SpringRunner;
com.burukeyou.uniapi.http.core.response.HttpResponse;
com.google.gson.Gson;
com.yelang.common.utils.StringUtils;
com.yelang.common.utils.poi.ExcelUtil;
com.yelang.project.education.domain.amap.AmapPoi;
com.yelang.project.education.domain.amap.AmapSearchVO;
com.yelang.project.thridinterface.AmapSearchService;
{
;
AmapSearchService amapSearchService;
InterruptedException {
;
;
;
;
;
HttpResponse<String> result = ;
();
;
;
List<AmapPoi> amapPoiData = <>();
{
result = amapSearchService.getSearch(keywords, types, region, page_size, String.valueOf(scrapingIndex), show_fields, AMAP_CLIENT_AK);
System.out.println(result.getBodyResult());
(StringUtils.isNotEmpty(result.getBodyResult())) {
gson.fromJson(result.getBodyResult(), AmapSearchVO.class);
amapPoiData.addAll(searchVO.getPois());
dataCount = searchVO.getCount();
scrapingIndex++;
}
Thread.sleep();
} (dataCount > );
System.out.println( + scrapingIndex);
System.out.println( + amapPoiData.size());
(amapPoiData.size() > ) {
ExcelUtil<AmapPoi> util = <>(AmapPoi.class);
util.exportExcel(amapPoiData, );
System.out.println();
}
}
}


