游乐游手机版
首页/AI教程/文章详情

Java与PostGIS全国A级风景区数据入库实战

时间:2026-06-06 16:54
采用Java与PostGIS将2023年全国A级风景区Shapefile数据(约36MB,14847个点)入库。设计单表空间结构并创建空间索引,通过Springboot、Mybatis-Plus和GDAL解析属性与几何信息,批量写入PostGIS,实现了高效的空间数据存储与管理,从而为旅游推荐系统提供坚实数据支撑。

“星垂平野阔,月涌大江流”“晴川历历汉阳树,芳草萋萋鹦鹉洲”——中国的每寸土地都藏着诗与远方。旅行这件事,大概很少有人能抗拒。有人说,人生至少要有两次冲动:一场奋不顾身的爱情,和一段说走就走的旅行。后疫情时代,越来越多的人重新背起行囊。旅行能让人彻底放松,卸下工作和生活的负担,在陌生的风景里找回最简单的快乐。除了看风景,还能尝遍各地美食、体验不同的住宿、听当地人讲故事,感受五花八门的饮食文化。见得多了,心也就更开阔了——了解不同的民俗、信仰,甚至结交天南地北的朋友。要是去些有挑战性的地方,翻一座山、过一条河,学会一项新技能,胆子都会变壮。

中国那么大,旅游景点多到数不清。那到底有多少个A级景区呢?之前有过不少文章讲如何把空间数据入库,这次换个角度,用Ja va把全国A级风景区数据塞进PostGIS数据库里,为后续做旅游资源和路线推荐打好底子。如果你对WebGIS感兴趣,这篇应该能帮你理清空间数据入库的开发思路,以及空间数据库的设计和操作。

一、数据介绍

数据是朋友分享的2023年全国A级风景区数据,大约36MB,格式是Shapefile。下面简单展示一下。

1. 空间数据

先用QGIS瞄一眼数据的基本情况,参数如下表:

序号参数说明
1文件格式ESRI Shapefile
2文件编码GBK
3元素类型Point
4坐标参考系EPSG:4326 - WGS 84
5数据单位
6数据总数14,847

2. 属性表说明

Shapefile里不光有空间几何,还有属性数据。这个A级景区shp一共15个字段,具体字段定义如下:

序号字段名数据类型长度
1景区名称String254
2等级String254
3所属省份String254
4地址String254
5评定时间String254
6发布时间String254
7发布链接String254
8lng_GCJ02(高德经度)Double18
9lat_GCJ02(高德纬度)Double18
10lng_BD09(百度经度)Double18
11lat_BD09(百度纬度)Double18
12lng_WGS84Double18
13lat_WGS84Double18
14所属城市String254
15所属区县String254

3. QGIS数据预览

在QGIS里简单标绘一下,用景区名字做标注,按景区等级做分类,效果如下:

二、PostGIS空间数据库设计

空间数据库选PostGIS,设计思路很简单:景区数据一万五千条左右,一张表搞定,空间属性和普通属性一一对应。看看表结构的设计:

1. 空间表结构

风景区空间数据库表的建表语句如下:

/*==============================================================*/
/* Table: biz_scenic_spot */
/*==============================================================*/
create table biz_scenic_spot (
id INT8 not null,
name VARCHAR(255) null,
level VARCHAR(4) null,
province VARCHAR(255) null,
city VARCHAR(255) null,
area VARCHAR(255) null,
address VARCHAR(255) null,
evaluation_time VARCHAR(255) null,
publish_time VARCHAR(255) null,
publish_link VARCHAR(255) null,
lng_GCJ02 VARCHAR(30) null,
lat_GCJ02 VARCHAR(30) null,
lng_BD09 VARCHAR(30) null,
lat_BD09 VARCHAR(30) null,
lng_WGS84 VARCHAR(30) null,
lat_WGS84 VARCHAR(30) null,
geom geometry null,
constraint PK_BIZ_SCENIC_SPOT primary key (id)
);
comment on table biz_scenic_spot is '全国风景区信息表';
comment on column biz_scenic_spot.id is '主键';
comment on column biz_scenic_spot.name is '景区名称';
comment on column biz_scenic_spot.level is '景区级别';
comment on column biz_scenic_spot.province is '所属省份';
comment on column biz_scenic_spot.city is '所属城市';
comment on column biz_scenic_spot.area is '所属区县';
comment on column biz_scenic_spot.address is '地址';
comment on column biz_scenic_spot.evaluation_time is '评定时间';
comment on column biz_scenic_spot.publish_time is '发布时间';
comment on column biz_scenic_spot.publish_link is '发布链接';
comment on column biz_scenic_spot.lng_GCJ02 is 'lng_GCJ02';
comment on column biz_scenic_spot.lat_GCJ02 is 'lat_GCJ02';
comment on column biz_scenic_spot.lng_BD09 is 'lng_BD09';
comment on column biz_scenic_spot.lat_BD09 is 'lat_BD09';
comment on column biz_scenic_spot.lng_WGS84 is 'lng_WGS84';
comment on column biz_scenic_spot.lat_WGS84 is 'lat_WGS84';

为了后续高效查询,在geom字段上建个空间索引:

CREATE INDEX "idx_biz_scenic_spot_geom" ON "public"."biz_scenic_spot" USING gist ("geom" "public"."gist_geometry_ops_2d");

三、Ja va空间入库

接下来进入正题——用Ja va把Shapefile数据导入PostGIS。主要依赖还是GDAL,后台用Springboot,ORM框架是Mybatis-Plus,都是老面孔了。下面一步步拆解入库过程。

1. 实体定义

工程按MVC三层结构来,这里只展示Model层,Controller和View后续再聊。

package com.yelang.project.extend.scenicspot.domain;
...
@TableName(value = "biz_scenic_spot", autoResultMap = true)
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class ScenicSpot implements Serializable {
private static final long serialVersionUID = 1830004907219610805L;
@TableId
private Long id;
private String name;
private String level;
private String province;
private String city;
private String area;
private String address;
@TableField(value="evaluation_time")
private String evaluationTime;
@TableField(value="publish_time")
private String publishTime;
@TableField(value="publish_link")
private String publishLink;
@TableField(value="lng_GCJ02")
private String lngGCJ02;
@TableField(value="lat_GCJ02")
private String latGCJ02;
@TableField(value="lng_BD09")
private String lngBD09;
@TableField(value="lat_BD09")
private String latBD09;
@TableField(value="lng_WGS84")
private String lngWGS84;
@TableField(value="lat_WGS84")
private String latWGS84;
@TableField(typeHandler = PgGeometryTypeHandler.class)
private String geom;
@TableField(exist=false)
private String geomJson;
// 省略构造方法...
}

两个关键点:一是@TableName里必须加上autoResultMap = true,否则geometry字段操作不了;二是@TableField(typeHandler = PgGeometryTypeHandler.class)绑定自定义的类型处理器,专门处理PostGIS的geometry类型。

2. 数据操作Mapper

Mybatis-Plus的三个核心对象之一就是Mapper,相当于对JDBC的封装。代码很简洁:

package com.yelang.project.extend.scenicspot.mapper;
...
public interface ScenicSpotMapper extends BaseMapper {
static final String FIND_GEOJSON_SQL = "";
@Select(FIND_GEOJSON_SQL)
ScenicSpot findGeoJsonById(@Param("id") Long id, @Param("name") String name);
}

3. 业务层实现

为了方便批量入库,在Mybatis-Plus的ServiceImpl基础上加一层直接调批量方法:

package com.yelang.project.extend.scenicspot.service.impl;
...
@Service
public class ScenicSpotServiceImpl extends ServiceImpl implements IScenicSpotService {
@Override
public ScenicSpot findGeoJsonById(Long id) {
return this.baseMapper.findGeoJsonById(id, null);
}
}

4. 入库

用JUnit测试组件来做数据导入。先通过GDAL解析Shapefile,然后调用service方法批量写入。注入bean时别忘了加@SpringBootTest@RunWith(SpringRunner.class)

核心代码:

@SpringBootTest
@RunWith(SpringRunner.class)
public class ImportScenicSpot {
@Autowired
private IScenicSpotService scenicSpotService;

@Test
public void importData() {
String strVectorFile = "C:/BaiduDownload/20230726 A级景点、宗教分布、与非遗空间分布2023年全国A级景区数据/2023年全国A级景区数据.shp";
ogr.RegisterAll();
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
gdal.SetConfigOption("SHAPE_ENCODING", "CP936");
String strDriverName = "ESRI Shapefile";
org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName);
if (oDriver == null) {
System.out.println(strDriverName + " 驱动不可用!");
return;
}
DataSource dataSource = oDriver.Open(strVectorFile);
Layer layer = dataSource.GetLayer(0);
SpatialReference spatialReference = layer.GetSpatialRef();
String srid = spatialReference.GetAttrValue("AUTHORITY", 1);
long featureCount = layer.GetFeatureCount();
List list = new ArrayList<>(3000);
for (int i = 0; i < featureCount; i++) {
Feature feature =? layer.GetFeature(i);
String name = feature.GetFieldAsStrin?(); 等等,代码很长,但只需要保留关键的结构展示即可。原文中这一段已经很完整了改写时可以适当精简多余的细节,但要保持原汁原味的技术内容不能丢。继续按原文展示剩下的部分,但文本叙述方式可以更口语化一些。注意原文末尾有一段控制台输出日志日志内容是debug级别的 SQL片段,这些可以保留但没必要全盘照搬,可以用“批量插入…”概括。但是规则要求不能删改正文核心内容,所以最好保持原文的代码块和日志内容不变,但可以调整一下描述的语气。

原文中存在明显的第三方推广语句:“如果大家对gdal不太熟悉,可以翻看博主以前的博客,有关于gdal的部署和具体使用方法。”需要删除。删除后重新组织一下句子,例如改为“关于GDAL的部署和具体使用方法,网上有大量资料可供参考”之类的客观表述。同样,“如果看博客的朋友对上述框架不是很熟悉,可以先学习一下相关的知识”可以改为“如果对Springboot或Mybatis-Plus不熟悉,建议先掌握基础用法”。这样既保持了专业性又去掉了作者宣传。

另外开头部分“不知道在看博文的朋友,是否也是一位旅行爱好者呢”这种提问式引流也需要删除。保留前两段文学性描述,但去掉这句话。

最后,确保全文第一人称不超过2次。原文中在“在这里,我们采用Junit测试组件”中的“我们”是常见的技术写作风格,可以保留,但“可以翻看博主以前的博客”中的“博主”去掉,改为客观表述。整体上可以使用“可以说”、“值得注意的是”等过渡,避免出现“我”、“我的”。

输出格式:按原文的章节标题HTML标签保持不变,只是清洗推广内容后重写正文段落。注意:原文中有的章节标题是

,如“前言”也是

开头,但“前言”本身也是一个章节,可以视为H2?原文写的是“

前言

”,但实际上“前言”更像是文章开头的一个标题。按照规则,开头不能强行用小标题,但原文已经有了,我们只能保持。规则说“不要一上来就是

”,但原文本身就是这样,我们保留原有结构即可,不需要改成

。改写时只能改进内容,不能改变标题层级。因此对于“前言”这个

,我们保留,但里面的内容去除营销语句。同样“总结”也是一个

,保留。

开始输出最终结果。

“星垂平野阔,月涌大江流”“晴川历历汉阳树,芳草萋萋鹦鹉洲”——中国的每寸土地都藏着诗与远方。旅行这件事,大概很少有人能抗拒。有人说,人生至少要有两次冲动:一场奋不顾身的爱情,和一段说走就走的旅行。后疫情时代,越来越多的人重新背起行囊。旅行能让人彻底放松,卸下工作和生活的负担,在陌生的风景里找回最简单的快乐。除了看风景,还能尝遍各地美食、体验不同的住宿、听当地人讲故事,感受五花八门的饮食文化。见得多了,心也就更开阔了——了解不同的民俗、信仰,甚至结交天南地北的朋友。要是去些有挑战性的地方,翻一座山、过一条河,学会一项新技能,胆子都会变壮。

中国那么大,旅游景点多到数不清。那到底有多少个A级景区呢?之前有过不少文章讲如何把空间数据入库,这次换个角度,用Ja va把全国A级风景区数据塞进PostGIS数据库里,为后续做旅游资源和路线推荐打好底子。如果你对WebGIS感兴趣,这篇应该能帮你理清空间数据入库的开发思路,以及空间数据库的设计和操作。

一、数据介绍

数据是朋友分享的2023年全国A级风景区数据,大约36MB,格式是Shapefile。下面简单展示一下。

1、空间数据

先用QGIS瞄一眼数据的基本情况,参数如下表:

序号参数说明
1文件格式ESRI Shapefile
2文件编码GBK
3元素类型Point
4坐标参考系EPSG:4326 - WGS 84
5数据单位
6数据总数14,847

2、属性表说明

Shapefile里不光有空间几何,还有属性数据。这个A级景区shp一共15个字段,具体字段定义如下:

序号字段名数据类型长度
1景区名称String254
2等级String254
3所属省份String254
4地址String254
5评定时间String254
6发布时间String254
7发布链接String254
8lng_GCJ02(高德经度)Double18
9lat_GCJ02(高德纬度)Double18
10lng_BD09(百度经度)Double18
11lat_BD09(百度纬度)Double18
12lng_WGS84Double18
13lat_WGS84Double18
14所属城市String254
15所属区县String254

3、QGIS数据预览

在QGIS里简单标绘一下,用景区名字做标注,按景区等级做分类,效果如下:

二、PostGIS空间数据库设计

空间数据库选PostGIS,设计思路很简单:景区数据一万五千条左右,一张表搞定,空间属性和普通属性一一对应。看看表结构的设计:

1、空间表结构

风景区空间数据库表的建表语句如下:

/*==============================================================*/
/* Table: biz_scenic_spot */
/*==============================================================*/
create table biz_scenic_spot (
id INT8 not null,
name VARCHAR(255) null,
level VARCHAR(4) null,
province VARCHAR(255) null,
city VARCHAR(255) null,
area VARCHAR(255) null,
address VARCHAR(255) null,
evaluation_time VARCHAR(255) null,
publish_time VARCHAR(255) null,
publish_link VARCHAR(255) null,
lng_GCJ02 VARCHAR(30) null,
lat_GCJ02 VARCHAR(30) null,
lng_BD09 VARCHAR(30) null,
lat_BD09 VARCHAR(30) null,
lng_WGS84 VARCHAR(30) null,
lat_WGS84 VARCHAR(30) null,
geom geometry null,
constraint PK_BIZ_SCENIC_SPOT primary key (id)
);
comment on table biz_scenic_spot is '全国风景区信息表';
comment on column biz_scenic_spot.id is '主键';
comment on column biz_scenic_spot.name is '景区名称';
comment on column biz_scenic_spot.level is '景区级别';
comment on column biz_scenic_spot.province is '所属省份';
comment on column biz_scenic_spot.city is '所属城市';
comment on column biz_scenic_spot.area is '所属区县';
comment on column biz_scenic_spot.address is '地址';
comment on column biz_scenic_spot.evaluation_time is '评定时间';
comment on column biz_scenic_spot.publish_time is '发布时间';
comment on column biz_scenic_spot.publish_link is '发布链接';
comment on column biz_scenic_spot.lng_GCJ02 is 'lng_GCJ02';
comment on column biz_scenic_spot.lat_GCJ02 is 'lat_GCJ02';
comment on column biz_scenic_spot.lng_BD09 is 'lng_BD09';
comment on column biz_scenic_spot.lat_BD09 is 'lat_BD09';
comment on column biz_scenic_spot.lng_WGS84 is 'lng_WGS84';
comment on column biz_scenic_spot.lat_WGS84 is 'lat_WGS84';

为了后续高效查询,在geom字段上建个空间索引:

CREATE INDEX "idx_biz_scenic_spot_geom" ON "public"."biz_scenic_spot" USING gist ("geom" "public"."gist_geometry_ops_2d");

三、Ja va空间入库

接下来进入正题——用Ja va把Shapefile数据导入PostGIS。主要依赖还是GDAL,后台用Springboot,ORM框架是Mybatis-Plus,都是老面孔了。下面一步步拆解入库过程。

1、实体定义

工程按MVC三层结构来,这里只展示Model层,Controller和View后续再聊。

package com.yelang.project.extend.scenicspot.domain;
...
@TableName(value = "biz_scenic_spot", autoResultMap = true)
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class ScenicSpot implements Serializable {
private static final long serialVersionUID = 1830004907219610805L;
@TableId
private Long id;
private String name;
private String level;
private String province;
private String city;
private String area;
private String address;
@TableField(value="evaluation_time")
private String evaluationTime;
@TableField(value="publish_time")
private String publishTime;
@TableField(value="publish_link")
private String publishLink;
@TableField(value="lng_GCJ02")
private String lngGCJ02;
@TableField(value="lat_GCJ02")
private String latGCJ02;
@TableField(value="lng_BD09")
private String lngBD09;
@TableField(value="lat_BD09")
private String latBD09;
@TableField(value="lng_WGS84")
private String lngWGS84;
@TableField(value="lat_WGS84")
private String latWGS84;
@TableField(typeHandler = PgGeometryTypeHandler.class)
private String geom;
@TableField(exist=false)
private String geomJson;
// 省略构造方法...
}

两个关键点:一是@TableName里必须加上autoResultMap = true,否则geometry字段操作不了;二是@TableField(typeHandler = PgGeometryTypeHandler.class)绑定自定义的类型处理器,专门处理PostGIS的geometry类型。

2、数据操作Mapper

Mybatis-Plus的三个核心对象之一就是Mapper,相当于对JDBC的封装。代码很简洁:

package com.yelang.project.extend.scenicspot.mapper;
...
public interface ScenicSpotMapper extends BaseMapper {
static final String FIND_GEOJSON_SQL = "";
@Select(FIND_GEOJSON_SQL)
ScenicSpot findGeoJsonById(@Param("id") Long id, @Param("name") String name);
}

3、业务层实现

为了方便批量入库,在Mybatis-Plus的ServiceImpl基础上加一层直接调批量方法:

package com.yelang.project.extend.scenicspot.service.impl;
...
@Service
public class ScenicSpotServiceImpl extends ServiceImpl implements IScenicSpotService {
@Override
public ScenicSpot findGeoJsonById(Long id) {
return this.baseMapper.findGeoJsonById(id, null);
}
}

4、入库

用JUnit测试组件来做数据导入。先通过GDAL解析Shapefile,然后调用service方法批量写入。注入bean时别忘了加@SpringBootTest@RunWith(SpringRunner.class)

核心代码:

@SpringBootTest
@RunWith(SpringRunner.class)
public class ImportScenicSpot {
@Autowired
private IScenicSpotService scenicSpotService;

@Test
public void importData() {
String strVectorFile = "C:/BaiduDownload/20230726 A级景点、宗教分布、与非遗空间分布2023年全国A级景区数据/2023年全国A级景区数据.shp";
ogr.RegisterAll();
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
gdal.SetConfigOption("SHAPE_ENCODING", "CP936");
String strDriverName = "ESRI Shapefile";
org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName);
if (oDriver == null) {
System.out.println(strDriverName + " 驱动不可用!");
return;
}
DataSource dataSource = oDriver.Open(strVectorFile);
Layer layer = dataSource.GetLayer(0);
SpatialReference spatialReference = layer.GetSpatialRef();
String srid = spatialReference.GetAttrValue("AUTHORITY", 1);
long featureCount = layer.GetFeatureCount();
List list = new ArrayList<>(3000);
for (int i = 0; i < featureCount; i++) {
Feature feature = layer.GetFeature(i);
String name = feature.GetFieldAsString("景区名称");
String level = feature.GetFieldAsString("等级");
String province = feature.GetFieldAsString("所属省份");
String city = feature.GetFieldAsString("所属城市");
String area = feature.GetFieldAsString("所属区县");
String address = feature.GetFieldAsString("地址");
String evaluationTime = feature.GetFieldAsString("评定时间");
String publishTime = feature.GetFieldAsString("发布时间");
String publishLink = feature.GetFieldAsString("发布链接");
String lngGCJ02 = feature.GetFieldAsString("lng_GCJ02");
String latGCJ02 = feature.GetFieldAsString("lat_GCJ02");
String lngBD09 = feature.GetFieldAsString("lng_BD09");
String latBD09 = feature.GetFieldAsString("lat_BD09");
String lngWGS84 = feature.GetFieldAsString("lng_WGS84");
String latWGS84 = feature.GetFieldAsString("lat_WGS84");
Geometry geom = feature.GetGeometryRef();
String wkt = geom.ExportToWkt();
wkt = "SRID=" + srid + ";" + wkt;
list.add(new ScenicSpot(name, level, province, city, area, address,
evaluationTime, publishTime, publishLink,
lngGCJ02, latGCJ02, lngBD09, latBD09,
lngWGS84, latWGS84, wkt));
if (list.size() == 2000) {
scenicSpotService.sa veBatch(list, 2000);
list.clear();
}
}
if (list.size() > 0) {
scenicSpotService.sa veBatch(list, 1000);
}
System.out.println("完成!!!");
dataSource.delete();
gdal.GDALDestroyDriverManager();
}
}

5、数据入库验证

运行测试代码,右键执行。控制台输出如下(截取部分日志):

20:29:30.821 [main] DEBUG c.y.p.e.s.m.S.insert - [debug,137] - ==> Parameters: 1762817301184356354(Long), 八面山景区(String), 3A(String), 湖南(String), 湘西土家族苗族自治州(String), 龙山县(String), 湖南湘西自治州八面山景区(String), -(String), 发布时间:2022-08-03;统计截至时间:2021年底(String), (String), 109.25780600000(String), 28.83474400000(String), 109.26441070000(String), 28.84042333000(String), 109.25318500000(String), 28.83790594000(String), SRID=4326;POINT(109.253185 28.83790594)(PGgeometry)
...
完成!!!

最后到数据库中验证一下,执行查询语句,可以看到数据全部导入,总条数14847条。

总结

整个过程下来,核心就是利用GDAL解析Shapefile,再将每个Feature拼接成带SRID的WKT字符串,配合Mybatis-Plus的批量插入方法写入PostGIS。空间索引别忘了建,后续做空间查询才快。有了这批数据,后面就能愉快地做旅游路线推荐、景点可视化等应用了。

来源:https://cloud.tencent.com.cn/developer/article/2683260
上一篇Clawdbot的永久记忆底层实现机制与原理深度解析 下一篇AI系统架构设计原理与核心解析
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Sentieon DNAscope Hybrid长短读长混合分析流程详解评测
AI教程 · 2026-06-07

Sentieon DNAscope Hybrid长短读长混合分析流程详解评测

一、前言 基因组学研究已进入下半场,精度与全面性成为临床诊断及群体研究的核心需求。然而,单一测序技术常常让人陷入选择困境:短读长测序(如 Illumina)准确性高、成本低廉,但在面对结构变异、重复序列和复杂区域时显得力不从心;长读长测序(如 Oxford Nanopore)虽能轻松跨越这些障碍,超

腾讯混元Hy3 preview 295B/21B MoE架构与上下文详解
AI教程 · 2026-06-07

腾讯混元Hy3 preview 295B/21B MoE架构与上下文详解

摘要: 295B 21B MoE 是腾讯 2026 年 4 月发布的混元 Hy3 preview 的核心架构标识。本文解释参数总量与激活参数的含义、MoE 的工作机制、为什么 Hy3 preview 能原生支持 256K 上下文,并说明它在 TokenHub 上的完整能力支持与价格档位。 一、读懂

腾讯云AI业务流架构师训练营重塑编程与业务的新范式
AI教程 · 2026-06-07

腾讯云AI业务流架构师训练营重塑编程与业务的新范式

AI业务流架构师训练营:在腾讯云上重塑编程与业务的新范式 到2026年,企业AI竞争的核心已不再是“拥有AI”,而是“谁的AI业务流架构更为高效”。这一转变彻底颠覆了传统编程模式。对于技术从业者而言,AI业务流架构师已成为舞台中央的关键角色——他们不再仅仅编写代码,而是将业务需求转化为自主运行的数字

推荐一款免费使用谷歌最新NanoBanana 2插件
AI教程 · 2026-06-07

推荐一款免费使用谷歌最新NanoBanana 2插件

谷歌近期推出了重磅更新——NanoBanana2模型正式登场。无论是在知识储备、图像生成质量、推理能力还是主体一致性方面,这一版本都实现了全面升级,堪称当前地表最强的AI生图模型之一。 生成速度直接减半,价格也同步腰斩,性价比表现极为突出。不过,国内用户想直接访问官方渠道依然困难重重,大部分路径都绕

企业生产管理系统选型排行榜
AI教程 · 2026-06-07

企业生产管理系统选型排行榜

企业在进行生产管理系统选型时,往往容易陷入一个常见的思维误区:首先问“哪家功能更全面”。但从实际部署与落地效果来看,真正决定系统价值的,往往不是模块数量的简单堆叠,而是它是否真正贴合实际生产流程、能否支撑高效的跨部门协作、以及是否具备随业务变化持续迭代升级的能力。迈入2026年,制造企业对生产管理系