SpringBoot與PostGIS整合,實現(xiàn)智能交通GIS系統(tǒng)
作者:Java知識日歷
智能交通GIS系統(tǒng)就是利用地理信息系統(tǒng)(GIS)技術(shù)來管理和分析交通數(shù)據(jù),幫助城市管理者優(yōu)化交通規(guī)劃、提高交通效率并減少擁堵。
PostGIS是一個開源的空間數(shù)據(jù)庫擴展,專門用于增強PostgreSQL數(shù)據(jù)庫以支持地理空間對象。智能交通GIS系統(tǒng)就是利用地理信息系統(tǒng)(GIS)技術(shù)來管理和分析交通數(shù)據(jù),幫助城市管理者優(yōu)化交通規(guī)劃、提高交通效率并減少擁堵。
我們?yōu)槭裁催x擇PostGIS?
- 存儲空間數(shù)據(jù):PostGIS 允許你直接在關(guān)系型數(shù)據(jù)庫中存儲和管理空間數(shù)據(jù),而不需要額外的文件或外部系統(tǒng)。
- 空間索引:通過 GIST(Generalized Search Tree)索引加速空間查詢,提高性能。
- PostGIS 提供了一系列內(nèi)置函數(shù)和操作符,可以高效地處理空間數(shù)據(jù),包括距離計算、面積測量、交集檢測等。
- PostGIS 支持多種行業(yè)標(biāo)準(zhǔn)和開放協(xié)議,確保數(shù)據(jù)的互操作性和可移植性。
- 免費使用:完全開源,遵循 GNU General Public License (GPL)。
- 節(jié)省預(yù)算:減少對專有 GIS 軟件的依賴,降低運營成本。
哪些機構(gòu)使用了PostGIS?
- 美國環(huán)境保護(hù)局:使用 PostGIS 來存儲和分析環(huán)境數(shù)據(jù),包括空氣質(zhì)量、水質(zhì)等,以支持政策制定和公眾健康保護(hù)。
- 加拿大自然資源部: 利用 PostGIS 進(jìn)行土地覆蓋分類、地形分析等,支持國家的自然資源管理和環(huán)境保護(hù)工作。
- 英國政府:多個部門使用 PostGIS 來管理公共服務(wù)設(shè)施的位置數(shù)據(jù),如醫(yī)院、學(xué)校、公共交通站點等。
- Uber: 使用 PostGIS 來優(yōu)化司機的路線規(guī)劃,提高出行效率,并進(jìn)行實時交通數(shù)據(jù)分析。
- Airbnb: 使用 PostGIS 存儲和查詢房源的位置數(shù)據(jù),幫助用戶找到附近的住宿,并提供個性化的推薦服務(wù)。
- Mapbox : 提供的地圖服務(wù)和 SDKs 基于 PostGIS,用于存儲和處理大規(guī)模的地理空間數(shù)據(jù),支持全球范圍內(nèi)的地圖渲染和分析。
- TomTom: 使用 PostGIS 進(jìn)行交通數(shù)據(jù)的存儲和分析,提供實時交通更新和導(dǎo)航建議。
- QGIS : 一個流行的開源 GIS 軟件,支持與 PostGIS 數(shù)據(jù)庫的集成,允許用戶在桌面環(huán)境中進(jìn)行空間數(shù)據(jù)編輯和分析。
- 悉尼大學(xué): 研究團(tuán)隊使用 PostGIS 分析城市擴張、土地使用變化等環(huán)境科學(xué)問題。
代碼實操
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>smart-traffic-gis-system</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SmartTrafficGisSystem</name>
<description>Demo project for Spring Boot with PostgreSQL and PostGIS</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
<relativePath/><!-- lookup parent from repository -->
</parent>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 引入PostgreSQL JDBC驅(qū)動 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 引入PostGIS JDBC驅(qū)動 -->
<dependency>
<groupId>net.postgis</groupId>
<artifactId>postgis-jdbc</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties
spring.datasource.url=jdbc:postgresql://localhost:5432/trafficdb?currentSchema=public&createDatabaseIfNotExist=true
spring.datasource.username=postgres
spring.datasource.password=123456
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisDialect
初始化腳本
-- 啟用PostGIS擴展
CREATE EXTENSION IF NOT EXISTS postgis;
-- 創(chuàng)建traffic_data表,包含id、name和location字段
CREATE TABLE traffic_data (
id SERIAL PRIMARY KEY,
name VARCHAR(255),
location GEOMETRY(Point, 4326)
);
交通數(shù)據(jù)實體類
package com.example.smarttrafficsystem.model;
import org.locationtech.jts.geom.Point;
import javax.persistence.*;
/**
* 交通數(shù)據(jù)實體類,對應(yīng)數(shù)據(jù)庫中的traffic_data表
*/
@Entity
@Table(name = "traffic_data")
publicclass TrafficData {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // 主鍵ID,自增
private String name; // 交通點名稱
/**
* 地理位置字段,類型為Point,坐標(biāo)系為WGS84 (EPSG:4326)
*/
@Column(columnDefinition = "geometry(Point,4326)")
private Point location;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Point getLocation() {
return location;
}
public void setLocation(Point location) {
this.location = location;
}
}
Repository接口
package com.example.smarttrafficsystem.repository;
import com.example.smarttrafficsystem.model.TrafficData;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface TrafficDataRepository extends JpaRepository<TrafficData, Long> {
}
Service層
package com.example.smarttrafficsystem.service;
import com.example.smarttrafficsystem.model.TrafficData;
import com.example.smarttrafficsystem.repository.TrafficDataRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 業(yè)務(wù)邏輯層服務(wù)類,處理與交通數(shù)據(jù)相關(guān)的業(yè)務(wù)邏輯
*/
@Service
publicclass TrafficDataService {
@Autowired
private TrafficDataRepository trafficDataRepository;
/**
* 獲取所有交通數(shù)據(jù)
* @return 所有交通數(shù)據(jù)列表
*/
public List<TrafficData> getAllTrafficData() {
return trafficDataRepository.findAll();
}
/**
* 保存新的交通數(shù)據(jù)
* @param trafficData 要保存的交通數(shù)據(jù)對象
* @return 保存后的交通數(shù)據(jù)對象
*/
public TrafficData saveTrafficData(TrafficData trafficData) {
return trafficDataRepository.save(trafficData);
}
}
Controller層
package com.example.smarttrafficsystem.controller;
import com.example.smarttrafficsystem.model.TrafficData;
import com.example.smarttrafficsystem.service.TrafficDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/v1/traffic")
publicclass TrafficController {
@Autowired
private TrafficDataService trafficDataService;
/**
* 獲取所有交通數(shù)據(jù)
* @return 所有交通數(shù)據(jù)列表
*/
@GetMapping("/")
public List<TrafficData> getAllTrafficData() {
return trafficDataService.getAllTrafficData();
}
/**
* 創(chuàng)建新的交通數(shù)據(jù)
* @param trafficData 要創(chuàng)建的交通數(shù)據(jù)對象
* @return 創(chuàng)建后的交通數(shù)據(jù)對象
*/
@PostMapping("/")
public TrafficData createTrafficData(@RequestBody TrafficData trafficData) {
return trafficDataService.saveTrafficData(trafficData);
}
}
Application
package com.example.smarttrafficsystem;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SmartTrafficSystemApplication {
public static void main(String[] args) {
SpringApplication.run(SmartTrafficSystemApplication.class, args);
}
}
測試
$ curl -X POST http://localhost:8080/api/v1/traffic/ \
-H "Content-Type: application/json" \
-d '{"name": "New Traffic Point", "location": {"type": "Point", "coordinates": [125.678, 80.123]}}'
Respons:
{
"id": 1,
"name": "New Traffic Point",
"location": {
"type": "Point",
"coordinates": [125.678, 80.123]
}
}
$ curl -X GET http://localhost:8080/api/v1/traffic/
Respons:
[
{
"id": 1,
"name": "New Traffic Point",
"location": {
"type": "Point",
"coordinates": [125.678, 80.123]
}
}
]
責(zé)任編輯:武曉燕
來源:
Java知識日歷