目录
[1.1 耒阳童车产业园项目背景](#1.1 耒阳童车产业园项目背景)
[1.2 周边检索API的必要性](#1.2 周边检索API的必要性)
[2.1 服务简介](#2.1 服务简介)
[2.2 核心请求参数](#2.2 核心请求参数)
[2.3 核心响应参数](#2.3 核心响应参数)
[3.1 开发环境准备](#3.1 开发环境准备)
[3.2 UnitHttp接口定义(原生Http工具类)](#3.2 UnitHttp接口定义(原生Http工具类))
[3.3 Java主程序调用(高德API接入+数据解析)](#3.3 Java主程序调用(高德API接入+数据解析))
[4.1 产业园位置概述](#4.1 产业园位置概述)
[4.2 1公里范围内企业列表](#4.2 1公里范围内企业列表)
[4.3 2公里范围内企业列表](#4.3 2公里范围内企业列表)
[4.4 3公里范围内企业列表](#4.4 3公里范围内企业列表)
一、前言
1.1 耒阳童车产业园项目背景
近期,央视《焦点访谈》专题曝光,湖南耒阳童车产业园沦为典型的虚假政绩工程、空心产业园 ,相关问题引发广泛关注,也让产业数据真实性、客观调研的重要性被推到台前。据通报与实地调查显示,耒阳在2021年不顾当地产业基础空白、缺乏童车产业链配套的实际,盲目提出打造"百亿级童车产业园"的浮夸目标,后续更是长期夸大数据、虚报产值:对外宣称园区入驻60余家企业、年产值破亿,实际仅建成2栋厂房,仅有1家核心组装企业+4家小微配套企业落地,2024年真实产值仅2165万元,却被虚报至3.47亿元,完全脱离实际,沦为"只喊口号、不见实体"的形象工程。当地在园区规划、招商、数据上报全流程缺乏客观调研,仅凭主观臆造数据打造政绩,既违背产业发展规律,也暴露出传统人工摸排、口头统计的巨大漏洞。

在这一背景下,精准、客观、可溯源的产业布局数据采集变得尤为重要。无论是复盘园区真实产业现状、核查虚报数据,还是后续园区整改、产业链补短板,都需要摒弃人工虚报、口头统计的弊端,依托精准时空检索技术,客观还原园区周边真实企业分布情况,摸清1-3公里范围内到底有多少实体企业、配套厂商,为产业整改、理性规划提供可靠的数据支撑,而非继续依赖虚假报表。无论是园区运营方、招商团队,还是相关企业,都需要精准、高效的周边企业数据,而非传统人工摸排,这就需要借助成熟的地图API实现自动化数据采集与整理,大幅提升数据获取效率和精准度。
1.2 周边检索API的必要性
耒阳童车产业园的问题核心短板之一就是缺乏客观的时空数据核验手段 ,传统人工统计、主观上报极易出现范围模糊、底数不清的问题,而高德地图周边检索API作为基于经纬度的精准时空检索服务,恰好能破解这一痛点。当然,除了使用高德地图之外,也是可以使用百度地图的API的。这种用技术手段实现客观、公正、可复现的企业数据采集,其核心优势高度适配本次实景核查需求:
-
时空定位精准,杜绝范围造假 :以园区核心经纬度为固定圆心,严格按1-3公里半径圈定检索范围,经度纬度双重锁定,彻底规避人工划定范围的随意性,实现定点、定时、定距的标准化空间检索,客观界定园区周边范围;
-
数据真实可溯源,破除虚报泡沫:直接调取地图POI真实实体数据,获取企业名称、详细地址、实际位置、经营类型等一手信息,不依赖人工上报、不采信虚假报表,实打实核验园区周边真实企业存量,戳破数据泡沫;
-
接口标准化,时空检索高效可控 :采用HTTP标准接口,支持按距离、行业类型精准筛选,可批量、重复调用,实现时空维度的批量数据抓取,短时间内完成多圈层企业布局梳理,效率远超人工摸排,且数据一致性强;
-
定位精准:支持经纬度定点检索,可自定义检索半径,精准圈定园区1-3公里范围,避免地域边界误差;
本次实战正是基于这一现实背景,以Java为开发语言,通过调用高德周边检索API,搭建时空精准检索的数据采集程序,摒弃人工干预和数据造假空间,以园区核心坐标为基准,分层级获取1-3公里范围内真实企业分布数据,既用技术手段还原耒阳童车产业园周边产业现状,也为同类产业园区的客观调研、数据核验、整改复盘提供可复用的技术方案。
二、高德周边检索服务简介
2.1 服务简介
高德周边检索(POI周边搜索)属于高德Web服务API中的搜索服务,核心功能是以指定经纬度为圆心,自定义半径范围内,按关键词或行业类型检索周边兴趣点(POI) ,本次场景中我们将检索目标设为"企业、公司"等相关类型,精准筛选园区周边工商注册类企业。使用前提:需前往高德开放平台注册开发者账号,创建应用并申请Web服务API Key(密钥),Key是调用接口的唯一身份凭证,务必妥善保管,避免泄露。关于如何申请API key,大家可以到之前的系列博客中查找,这里不再进行赘述。
2.2 核心请求参数
|-------------|-------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------|----------------------------------------|
| 参数名 | 含义 | 规则说明 | 是否必须 | 缺省值 |
| key | 高德Key | 用户在高德地图官网 申请 Web 服务 API 类型 Key | 必填 | 无 |
| keywords | 地点关键字 | 需要被检索的地点文本信息。 只支持一个关键字 ,文本总长度不可超过80字符 | 可选 | 无 |
| types | 指定地点类型 | 地点文本搜索接口支持按照设定的POI类型限定地点搜索结果;地点类型与 poi typecode 是同类内容,可以传入多个 poi typecode,相互之间用"|"分隔,内容可以参考 POI 分类码表;地点(POI)列表的排序会按照高德搜索能力进行综合权重排序; 当 keywords 和 types 均为空的时候,默认指定 types 为050000(餐饮服务)、070000(生活服务)、120000(商务住宅) | 可选 | 050000(餐饮服务) 070000(生活服务) 120000(商务住宅) |
| location | 中心点坐标 | 圆形区域检索中心点,不支持多个点。经度和纬度用","分割,经度在前,纬度在后,经纬度小数点后不得超过6位 | 必填 | 无 |
| radius | 搜索半径 | 取值范围:0-50000,大于50000时按默认值,单位:米 | 可选 | 5000 |
| sortrule | 排序规则 | 规定返回结果的排序规则。 按距离排序:distance;综合排序:weight | 可选 | distance |
| region | 搜索区划 | 增加指定区域内数据召回权重,如需严格限制召回数据在区域内,请搭配使用 city_limit 参数,可输入行政区划名或对应 citycode 或 adcode | 可选 | 无,默认全国范围内搜索 |
| city_limit | 指定城市数据召回限制 | 可选值:true/false 为 true 时,仅召回 region 对应区域内数据 | 可选 | false |
| show_fields | 返回结果控制 | show_fields 用来筛选 response 结果中可选字段。show_fields 的使用需要遵循如下规则: 1、具体可指定返回的字段类请见下方返回结果说明中的"show_fields"内字段类型; 2、多个字段间采用","进行分割; 3、show_fields 未设置时,只返回基础信息类内字段。 | 可选 | 空 |
| page_size | 当前分页展示的数据条数 | page_size 的取值1-25 | 可选 | page_size 默认为 10 |
| page_num | 请求第几分页 | 请求第几分页 | 可选 | page_num 默认为 1 |
| sig | 数字签名 | 请参考 数字签名获取和使用方法 | 可选 | 无 |
| output | 返回结果格式类型 | 默认格式为 json,目前只支持 json 格式; | 可选 | json |
| callback | 回调函数 | callback 值是用户定义的函数名称,此参数只在 output 参数设置为 JSON 时有效。 | 可选 | 无 |
2.3 核心响应参数
|---|---|----------------|--------|---------------------------------------------------------------------------------------------------------|
| 名称 ||| 类型 | 说明 |
| status ||| string | 本次 API 访问状态,如果成功返回1,如果失败返回0。 |
| info ||| string | 访问状态值的说明,如果成功返回"ok",失败返回错误原因,具体见 错误码说明。 |
| infocode ||| string | 返回状态说明,10000代表正确,详情参阅 info 状态表 |
| count ||| string | 单次请求返回的实际 poi 点的个数 |
| pois ||| object | 返回的 poi 完整集合 |
| | poi || | 单个 poi 内包含的完整返回数据 |
| || name | string | poi 名称 |
| || id | string | poi 唯一标识 |
| || parent | string | 父 POI 的 ID,当前 POI 如果有父 POI,则返回父 POI 的 ID。可能为空 |
| || location | string | poi 经纬度 |
| || distance | string | 离中心点距离,单位米 |
| || type | string | poi 所属类型 |
| || typecode | string | poi 分类编码 |
| || pname | string | poi 所属省份 |
| || cityname | string | poi 所属城市 |
| || adname | string | poi 所属区县 |
| || address | string | poi 详细地址 |
| || pcode | string | poi 所属省份编码 |
| || adcode | string | poi 所属区域编码 |
| || citycode | string | poi 所属城市编码 |
| 注意以下字段如需返回需要通过"show_fields"进行参数类设置。 |||||
| | children || object | 设置后返回子 POI 信息 |
| | | id | string | 子 poi 唯一标识 |
| | | name | string | 子 poi 名称 |
| | | location | string | 子 poi 经纬度 |
| | | address | string | 子 poi 详细地址 |
| | | subtype | string | 子 poi 所属类型 |
| | | typecode | string | 子 poi 分类编码 |
| | | sname | string | 子 poi 分类信息 |
| | business || object | 设置后返回 poi 商业信息 |
| | | business_area | string | poi 所属商圈 |
| | | opentime_today | string | poi 今日营业时间,如 08:30-17:30 08:30-09:00 12:00-13:30 09:00-13:00 |
| | | opentime_week | string | poi 营业时间描述,如 周一至周五:08:30-17:30(延时服务时间:08:30-09:00;12:00-13:30);周六延时服务时间:09:00-13:00(法定节假日除外) |
| | | tel | string | poi 的联系电话 |
| | | tag | string | poi 特色内容,目前仅在美食 poi 下返回 |
| | | rating | string | poi 评分,目前仅在餐饮、酒店、景点、影院类 POI 下返回 |
| | | cost | string | poi 人均消费,目前仅在餐饮、酒店、景点、影院类 POI 下返回 |
| | | parking_type | string | 停车场类型(地下、地面、路边),目前仅在停车场类 POI 下返回 |
| | | alias | string | poi 的别名,无别名时不返回 |
| | | keytag | string | poi 标识,用于确认poi信息类型 |
| | | rectag | string | 用于再次确认信息类型 |
| | indoor || object | 设置后返回室内相关信息 |
| | | indoor_map | string | 是否有室内地图标志,1为有,0为没有 |
| | | cpid | string | 如果当前 POI 为建筑物类 POI,则 cpid 为自身 POI ID;如果当前 POI 为商铺类 POI,则 cpid 为其所在建筑物的 POI ID。 indoor_map 为0时不返回 |
| | | floor | string | 楼层索引,一般会用数字表示,例如8;indoor_map 为0时不返回 |
| | | truefloor | string | 所在楼层,一般会带有字母,例如F8;indoor_map 为0时不返回 |
| | navi || object | 设置后返回导航位置相关信息 |
| | | navi_poiid | string | poi 对应的导航引导点坐标。大型面状 POI 的导航引导点,一般为各类出入口,方便结合导航、路线规划等服务使用 |
| | | entr_location | string | poi 的入口经纬度坐标 |
| | | exit_location | string | poi 的出口经纬度坐标 |
| | | gridcode | string | poi 的地理格 id |
| | photos || object | 设置后返回 poi 图片相关信息 |
| | | title | string | poi 的图片介绍 |
| | | url | string | poi 图片的下载链接 |
三、Java应用程序实现
3.1 开发环境准备
-
JDK版本:1.8及以上(本文用JDK1.8)
-
开发工具:IDEA/Eclipse
-
依赖:无第三方框架,仅用uniapi-http实现接口调用,搭配Gson解析JSON数据
-
前置:高德API Key、耒阳童车产业园核心经纬度
3.2 UnitHttp接口定义(原生Http工具类)
编写通用Http工具类,实现GET请求发送、响应数据接收,适配高德API接口调用,代码可直接复用:
java
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 {
/**
* -周边搜索API服务
*
* @param location 中心点坐标 规则: 经度和纬度用","分割,经度在前,纬度在后,经纬度小数点后不得超过6位
* @param keywords 查询关键字 规则: 只支持一个关键字
* @param types 查询POI类型 多个类型用"|"分割;可选值:分类代码 或 汉字 (若用汉字,请严格按照附件之中的汉字填写)
* @param region 查询城市 可选值:城市中文、中文全拼、citycode、adcode 如:北京/beijing/010/110000
* @param radius 查询半径 取值范围:0-50000。规则:大于50000按默认值,单位:米
* @param page_size 当前分页展示的数据条数
* @param page_num 请求第几分页
* @param show_fields 返回结果控制
* @param key
* @return
*/
@GetHttpInterface("/place/around")
public HttpResponse<String> searchByAround(@QueryPar("location") String location,
@QueryPar("keywords") String keywords, @QueryPar("types") String types, @QueryPar("region") String region,
@QueryPar("radius") int radius, @QueryPar("page_size") String page_size,
@QueryPar("page_num") String page_num, @QueryPar("show_fields") String show_fields,
@QueryPar("key") String key);
}
3.3 Java主程序调用(高德API接入+数据解析)
主程序实现参数拼接、接口调用、JSON解析、企业数据筛选输出,核心代码如下:
java
package com.yelang.project.unihttp;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.burukeyou.uniapi.http.core.response.HttpResponse;
import com.google.gson.Gson;
import com.yelang.common.utils.StringUtils;
import com.yelang.common.utils.geo.CoordinateTransformUtil;
import com.yelang.common.utils.poi.ExcelUtil;
import com.yelang.project.education.domain.amap.AmapPoi;
import com.yelang.project.education.domain.amap.AmapSearchVO;
import com.yelang.project.thridinterface.AmapSearchService;
@SpringBootTest
@RunWith(SpringRunner.class)
public class AmaPOISearchCase {
private static final String AMAP_CLIENT_AK = "yourAk";
@Autowired
private AmapSearchService amapSearchService;
/**
* - 根据中心点查询周边POI信息 add by 搜索城市为耒阳 夜郎king
* @throws InterruptedException
*/
@Test
public void searchAroundCase() throws InterruptedException {
String location = "112.868195,26.46236";
String keywords = "";
String types = "170000";
String file = "公司企业";
String page_size = "25";
int radius = 2000; // 半径2000米
String region = "430481";//耒阳
String show_fields = "children,business,indoor,navi,photos";
HttpResponse<String> result = null;
Gson gson = new Gson();
int scrapingIndex = 1;
int dataCount = 0;
List<AmapPoi> amapPoiData = new ArrayList<AmapPoi>();
do {
result = amapSearchService.searchByAround(location, keywords, types, region, radius, page_size, String.valueOf(scrapingIndex), show_fields, AMAP_CLIENT_AK);
System.out.println(result.getBodyResult());
if(StringUtils.isNotEmpty(result.getBodyResult())) {
AmapSearchVO searchVO = gson.fromJson(result.getBodyResult(), AmapSearchVO.class);
amapPoiData.addAll(searchVO.getPois());
dataCount = searchVO.getCount();
scrapingIndex ++;
}
Thread.sleep(3000L);//休眠3000秒
} while (dataCount > 0);
System.out.println("一共抓取数据页数:" + scrapingIndex);
System.out.println(amapPoiData.size());
if(amapPoiData.size() > 0) {
// excel工具包
ExcelUtil<AmapPoi> util = new ExcelUtil<AmapPoi>(AmapPoi.class);
util.exportExcel(amapPoiData, "耒阳市三架街道白洋渡村二公里"+ file +"信息列表");
System.out.println("finished");
}
}
}
在IDE中运行以上程序后,可以看到以下输出说明程序正常执行。

注意事项:1. 需引入Gson依赖,用于解析JSON数据;2. 务必替换代码中的AMAP_KEY为自己申请的密钥;3. 经纬度可通过高德坐标拾取工具精准获取园区中心点坐标。
四、成果展示
4.1 产业园位置概述
耒阳童车产业园位于湖南省衡阳市耒阳市境内,这里选取的参考为白洋渡村村委会,核心中心点经纬度:112.868195,26.46236,地处耒阳产业规划片区。本次检索范围以村委会为圆心,半径1公里、2公里、3公里逐级扩大,梳理不同距离圈层的企业布局。通过展示产业园的企业分布,对产业园的产业配套可以做一个配置预估。也对产业发展做一个评估。下图这两幢厂房或许就是记者视角下的两座厂房吧。

4.2 1公里范围内企业列表
1公里范围属于园区核心紧邻区域,1公里内的企业信息如下:


可以看到,在1公里范围之内,企业大约有30家,但是真正与童车相关的真的就寥寥无几了。
4.3 2公里范围内企业列表
2公里范围覆盖园区周边临近产业片区,企业数量明显增多,

从数量来说,虽然增加了23家企业,但是依然可以看到,跟童车相关依然不多,缺乏上下游配套。
4.4 3公里范围内企业列表
3公里范围的企业更多了,一共有85家。但是这85家与童车的产业相关度比较低。因此完善的上下游产业并未形成。

数据说明:本文仅展示核心代表性企业,实际运行代码可获取全量明细。从以上结果来看,基本符合新闻的调查研究。
五、总结
本次实战通过Java原生Http工具结合高德周边检索API,高效完成了耒阳童车产业园1-3公里企业分布数据的获取,全程实现自动化、精准化、轻量化数据采集,完美解决传统人工摸排的痛点,整体流程可总结为:
-
申请高德API Key,确定检索中心点与范围;
-
编写通用Http工具类,实现接口调用;
-
拼接请求参数,调用周边检索接口;
-
解析JSON响应数据,筛选整理企业信息;
-
按距离分段输出成果,完成数据梳理。
技术拓展与优化方向
-
增加数据持久化,将结果存入数据库,便于后续分析;
-
增加异常处理、重试机制,提升程序稳定性。
本文代码可直接复用至其他园区、商圈、点位的周边检索场景,只需修改经纬度、关键词、检索半径即可适配,是Java后端接入地图API的典型实战案例,希望能帮助到各位开发者快速上手高德地图API开发。行文仓促,难免有许多不足之处,如果在实操中遇到问题,欢迎在评论区评论交流~。