【PostgreSQL 03】PostGIS空間數據深度實戰:從地圖服務到智慧城市

PostGIS空間數據深度實戰:從地圖服務到智慧城市

關鍵詞
PostGIS, 空間數據庫, 地理信息系統, GIS, 空間查詢, 地理分析, 位置服務, 智慧城市, 空間索引, 坐標系統

摘要
PostGIS是PostgreSQL的空間數據擴展,它將普通的關系數據庫轉變為強大的地理信息系統。本文將從零開始,通過生動的實例和通俗易懂的語言,帶你掌握PostGIS的核心概念和實戰技能。從簡單的地圖服務到復雜的智慧城市應用,從基礎的空間查詢到高級的地理分析,我們將一步步構建完整的空間數據解決方案。無論你是想要開發LBS應用,還是要構建城市管理系統,這篇文章都將為你提供扎實的技術基礎。


引言:當數據庫遇上地圖

想象一下這樣的場景:

你正在開發一個外賣平臺,產品經理提出了這些需求:

  • “用戶下單時,自動推薦附近2公里內的餐廳”
  • “配送員接單后,計算最優配送路線”
  • “分析哪些區域訂單密度最高,方便商家選址”
  • “實時監控配送員位置,預估送達時間”

如果用傳統的關系數據庫,你可能會這樣處理:

-- 傳統方案:用三角函數計算距離
SELECT restaurant_name,SQRT(POW(lat - 39.9042, 2) + POW(lng - 116.4074, 2)) as distance
FROM restaurants 
WHERE SQRT(POW(lat - 39.9042, 2) + POW(lng - 116.4074, 2)) < 0.02
ORDER BY distance;

但這種方案有什么問題呢?

  • 計算不準確(地球是球體,不是平面)
  • 性能很差(無法使用索引)
  • 功能有限(無法處理復雜的地理關系)
  • 擴展困難(新增地理功能需要大量代碼)

PostGIS就是為了解決這些問題而生的。它讓數據庫原生支持地理數據,就像支持數字和文本一樣自然。

在這里插入圖片描述

第一部分:PostGIS基礎 - 讓數據庫理解地理世界

什么是PostGIS?

PostGIS可以理解為PostgreSQL的"地理大腦"。它為數據庫添加了:

  1. 空間數據類型:點、線、面等幾何對象
  2. 空間函數:距離計算、相交判斷等地理運算
  3. 空間索引:高效的地理查詢性能
  4. 坐標系統:支持全球各種地圖投影

安裝和啟用PostGIS

-- 安裝PostGIS擴展
CREATE EXTENSION postgis;-- 查看PostGIS版本
SELECT PostGIS_Version();-- 查看支持的空間參考系統
SELECT srid, proj4text FROM spatial_ref_sys LIMIT 5;

核心空間數據類型

PostGIS提供了豐富的空間數據類型,就像幾何學中的基本圖形:

1. POINT(點)

-- 創建點幾何
SELECT ST_GeomFromText('POINT(116.4074 39.9042)', 4326) as beijing_center;-- 從經緯度創建點
SELECT ST_Point(116.4074, 39.9042) as point_geom;

2. LINESTRING(線)

-- 創建線幾何(道路、路徑)
SELECT ST_GeomFromText('LINESTRING(116.40 39.90, 116.41 39.91, 116.42 39.92)', 4326) as road;

3. POLYGON(面)

-- 創建多邊形(區域、邊界)
SELECT ST_GeomFromText('POLYGON((116.40 39.90, 116.41 39.90, 116.41 39.91, 116.40 39.91, 116.40 39.90))', 4326) as area;

坐標系統:地球不是平的

這是PostGIS中最重要但也最容易被忽視的概念。想象一下:

  • 地理坐標系(如WGS84,SRID 4326):就像地球儀上的經緯度
  • 投影坐標系(如UTM):就像把地球儀攤平成地圖
-- WGS84地理坐標系(經緯度)
SELECT ST_GeomFromText('POINT(116.4074 39.9042)', 4326) as wgs84_point;-- 轉換為投影坐標系(米為單位)
SELECT ST_Transform(ST_GeomFromText('POINT(116.4074 39.9042)', 4326), 3857) as web_mercator;

第二部分:空間查詢實戰 - 掌握地理關系分析

在這里插入圖片描述

實戰案例:構建外賣配送系統

讓我們構建一個完整的外賣配送系統,學習各種空間查詢:

-- 創建餐廳表
CREATE TABLE restaurants (id SERIAL PRIMARY KEY,name VARCHAR(100),location GEOMETRY(POINT, 4326),delivery_radius INTEGER DEFAULT 3000, -- 配送半徑(米)cuisine_type VARCHAR(50),rating DECIMAL(3,2)
);-- 創建用戶表
CREATE TABLE users (id SERIAL PRIMARY KEY,name VARCHAR(100),current_location GEOMETRY(POINT, 4326),address TEXT
);-- 創建配送員表
CREATE TABLE drivers (id SERIAL PRIMARY KEY,name VARCHAR(100),current_location GEOMETRY(POINT, 4326),is_available BOOLEAN DEFAULT true,vehicle_type VARCHAR(20)
);-- 插入測試數據
INSERT INTO restaurants (name, location, delivery_radius, cuisine_type, rating) VALUES 
('老北京炸醬面', ST_Point(116.4551, 39.9380, 4326), 2000, '中餐', 4.5),
('麥當勞', ST_Point(116.4579, 39.9081, 4326), 3000, '快餐', 4.2),
('海底撈', ST_Point(116.3105, 39.9830, 4326), 5000, '火鍋', 4.8);INSERT INTO users (name, current_location, address) VALUES 
('張三', ST_Point(116.4520, 39.9350, 4326), '三里屯SOHO'),
('李四', ST_Point(116.3100, 39.9800, 4326), '中關村大街');INSERT INTO drivers (name, current_location, vehicle_type) VALUES 
('王師傅', ST_Point(116.4500, 39.9300, 4326), '電動車'),
('趙師傅', ST_Point(116.3150, 39.9820, 4326), '摩托車');

核心空間查詢操作

1. 距離查詢 - ST_DWithin

-- 查找用戶附近2公里內的餐廳
SELECT r.name,r.cuisine_type,r.rating,ST_Distance(r.location, u.current_location) as distance_meters
FROM restaurants r,users u
WHERE u.name = '張三'AND ST_DWithin(r.location, u.current_location, 2000)
ORDER BY distance_meters;

2. 包含查詢 - ST_Contains

-- 創建配送區域
CREATE TABLE delivery_zones (id SERIAL PRIMARY KEY,zone_name VARCHAR(100),boundary GEOMETRY(POLYGON, 4326),delivery_fee DECIMAL(10,2)
);-- 插入配送區域
INSERT INTO delivery_zones (zone_name, boundary, delivery_fee) VALUES 
('市中心區', ST_GeomFromText('POLYGON((116.35 39.85, 116.50 39.85, 116.50 39.95, 116.35 39.95, 116.35 39.85))', 4326), 5.00);-- 查找用戶所在的配送區域
SELECT u.name,dz.zone_name,dz.delivery_fee
FROM users u
JOIN delivery_zones dz ON ST_Contains(dz.boundary, u.current_location);

3. 最近鄰查詢 - ST_Distance + ORDER BY

-- 為訂單分配最近的配送員
WITH order_location AS (SELECT ST_Point(116.4550, 39.9370, 4326) as location
)
SELECT d.name,d.vehicle_type,ST_Distance(d.current_location, ol.location) as distance
FROM drivers d,order_location ol
WHERE d.is_available = true
ORDER BY distance
LIMIT 1;

4. 相交查詢 - ST_Intersects

-- 查找與配送路線相交的區域
CREATE TABLE traffic_zones (id SERIAL PRIMARY KEY,zone_name VARCHAR(100),boundary GEOMETRY(POLYGON, 4326),traffic_level VARCHAR(20)
);-- 配送路線
WITH delivery_route AS (SELECT ST_MakeLine(ARRAY[ST_Point(116.4551, 39.9380, 4326),  -- 餐廳ST_Point(116.4520, 39.9350, 4326)   -- 用戶]) as route
)
SELECT tz.zone_name,tz.traffic_level
FROM traffic_zones tz,delivery_route dr
WHERE ST_Intersects(tz.boundary, dr.route);

第三部分:高級空間分析 - 構建智能決策系統

緩沖區分析

緩沖區就像在地圖上畫圓圈,用于分析影響范圍:

-- 分析餐廳配送覆蓋范圍
SELECT r.name,ST_Buffer(r.location, r.delivery_radius) as coverage_area
FROM restaurants r;-- 查找配送覆蓋范圍重疊的餐廳
SELECT r1.name as restaurant1,r2.name as restaurant2,ST_Area(ST_Intersection(ST_Buffer(r1.location, r1.delivery_radius),ST_Buffer(r2.location, r2.delivery_radius))) as overlap_area
FROM restaurants r1,restaurants r2
WHERE r1.id < r2.idAND ST_Intersects(ST_Buffer(r1.location, r1.delivery_radius),ST_Buffer(r2.location, r2.delivery_radius));

熱力圖分析

分析訂單密度分布,幫助商家選址:

-- 創建訂單表
CREATE TABLE orders (id SERIAL PRIMARY KEY,user_id INTEGER REFERENCES users(id),restaurant_id INTEGER REFERENCES restaurants(id),delivery_location GEOMETRY(POINT, 4326),order_time TIMESTAMP DEFAULT NOW(),total_amount DECIMAL(10,2)
);-- 網格化熱力圖分析
WITH order_grid AS (SELECT ST_SnapToGrid(delivery_location, 0.01) as grid_cell,  -- 創建1km網格COUNT(*) as order_count,AVG(total_amount) as avg_amountFROM ordersWHERE order_time >= NOW() - INTERVAL '30 days'GROUP BY ST_SnapToGrid(delivery_location, 0.01)
)
SELECT ST_X(grid_cell) as longitude,ST_Y(grid_cell) as latitude,order_count,avg_amount,CASE WHEN order_count > 100 THEN '熱點區域'WHEN order_count > 50 THEN '活躍區域'ELSE '一般區域'END as area_type
FROM order_grid
WHERE order_count > 10
ORDER BY order_count DESC;

路徑分析

計算最優配送路線:

-- 簡化的路徑分析(實際應用中需要路網數據)
CREATE OR REPLACE FUNCTION calculate_delivery_route(restaurant_point GEOMETRY,user_point GEOMETRY
) RETURNS TABLE(route_geometry GEOMETRY,distance_km DECIMAL,estimated_time_minutes INTEGER
) AS $$
BEGINRETURN QUERYSELECT ST_MakeLine(restaurant_point, user_point) as route_geometry,ROUND(ST_Distance(restaurant_point, user_point)::DECIMAL / 1000, 2) as distance_km,ROUND(ST_Distance(restaurant_point, user_point) / 500)::INTEGER as estimated_time_minutes; -- 假設500米/分鐘
END;
$$ LANGUAGE plpgsql;-- 使用路徑分析函數
SELECT * FROM calculate_delivery_route(ST_Point(116.4551, 39.9380, 4326),  -- 餐廳位置ST_Point(116.4520, 39.9350, 4326)   -- 用戶位置
);

第四部分:智慧城市應用 - 大規模空間數據處理

在這里插入圖片描述

交通流量分析系統

-- 創建交通監測點表
CREATE TABLE traffic_sensors (id SERIAL PRIMARY KEY,sensor_name VARCHAR(100),location GEOMETRY(POINT, 4326),road_segment_id INTEGER,sensor_type VARCHAR(50)
);-- 創建交通流量數據表
CREATE TABLE traffic_data (id SERIAL PRIMARY KEY,sensor_id INTEGER REFERENCES traffic_sensors(id),timestamp TIMESTAMP,vehicle_count INTEGER,average_speed DECIMAL(5,2),congestion_level VARCHAR(20)
);-- 實時交通流量分析
WITH current_traffic AS (SELECT ts.sensor_name,ts.location,td.vehicle_count,td.average_speed,td.congestion_level,ST_Buffer(ts.location, 500) as influence_area  -- 500米影響范圍FROM traffic_sensors tsJOIN traffic_data td ON ts.id = td.sensor_idWHERE td.timestamp >= NOW() - INTERVAL '5 minutes'
),
congestion_areas AS (SELECT ST_Union(influence_area) as congested_areaFROM current_trafficWHERE congestion_level = '擁堵'
)
-- 查找受擁堵影響的配送路線
SELECT o.id as order_id,ST_Length(ST_Intersection(ST_MakeLine(r.location, o.delivery_location),ca.congested_area)) as affected_route_length
FROM orders o
JOIN restaurants r ON o.restaurant_id = r.id,congestion_areas ca
WHERE o.order_time >= NOW() - INTERVAL '1 hour'AND ST_Intersects(ST_MakeLine(r.location, o.delivery_location),ca.congested_area);

環境監測與分析

-- 創建環境監測站表
CREATE TABLE environmental_stations (id SERIAL PRIMARY KEY,station_name VARCHAR(100),location GEOMETRY(POINT, 4326),station_type VARCHAR(50)
);-- 創建環境數據表
CREATE TABLE environmental_data (id SERIAL PRIMARY KEY,station_id INTEGER REFERENCES environmental_stations(id),timestamp TIMESTAMP,pm25_value DECIMAL(6,2),temperature DECIMAL(4,1),humidity DECIMAL(4,1),noise_level DECIMAL(4,1)
);-- 空氣質量影響分析
WITH pollution_sources AS (SELECT es.location,ed.pm25_value,-- 根據PM2.5值計算影響半徑CASE WHEN ed.pm25_value > 75 THEN 2000WHEN ed.pm25_value > 35 THEN 1000ELSE 500END as influence_radiusFROM environmental_stations esJOIN environmental_data ed ON es.id = ed.station_idWHERE ed.timestamp >= NOW() - INTERVAL '1 hour'AND ed.pm25_value > 35  -- 輕度污染以上
)
-- 分析受空氣污染影響的餐廳
SELECT r.name,r.location,ps.pm25_value,ST_Distance(r.location, ps.location) as distance_to_pollution
FROM restaurants r,pollution_sources ps
WHERE ST_DWithin(r.location, ps.location, ps.influence_radius)
ORDER BY ps.pm25_value DESC, distance_to_pollution;

應急響應系統

-- 創建應急事件表
CREATE TABLE emergency_events (id SERIAL PRIMARY KEY,event_type VARCHAR(50),location GEOMETRY(POINT, 4326),severity_level INTEGER, -- 1-5級event_time TIMESTAMP DEFAULT NOW(),description TEXT,status VARCHAR(20) DEFAULT 'active'
);-- 創建應急資源表
CREATE TABLE emergency_resources (id SERIAL PRIMARY KEY,resource_type VARCHAR(50), -- 消防車、救護車、警車current_location GEOMETRY(POINT, 4326),is_available BOOLEAN DEFAULT true,capacity INTEGER
);-- 應急響應資源調度
CREATE OR REPLACE FUNCTION emergency_response(event_location GEOMETRY,event_severity INTEGER
) RETURNS TABLE(resource_id INTEGER,resource_type VARCHAR,distance_km DECIMAL,estimated_arrival_minutes INTEGER,priority_score DECIMAL
) AS $$
DECLAREresponse_radius INTEGER;
BEGIN-- 根據事件嚴重程度確定響應半徑response_radius := event_severity * 2000; -- 每級2公里RETURN QUERYSELECT er.id,er.resource_type,ROUND(ST_Distance(er.current_location, event_location)::DECIMAL / 1000, 2),ROUND(ST_Distance(er.current_location, event_location) / 800)::INTEGER, -- 假設800米/分鐘-- 優先級評分:距離越近、容量越大分數越高ROUND((10000 - ST_Distance(er.current_location, event_location)) / 100 + er.capacity, 2)FROM emergency_resources erWHERE er.is_available = trueAND ST_DWithin(er.current_location, event_location, response_radius)ORDER BY priority_score DESC;
END;
$$ LANGUAGE plpgsql;-- 使用應急響應函數
SELECT * FROM emergency_response(ST_Point(116.4074, 39.9042, 4326),  -- 天安門廣場4  -- 4級嚴重事件
);

第五部分:性能優化與最佳實踐

空間索引優化

-- 創建空間索引
CREATE INDEX idx_restaurants_location ON restaurants USING GIST (location);
CREATE INDEX idx_users_location ON users USING GIST (current_location);
CREATE INDEX idx_drivers_location ON drivers USING GIST (current_location);-- 查看索引使用情況
EXPLAIN (ANALYZE, BUFFERS) 
SELECT * FROM restaurants 
WHERE ST_DWithin(location, ST_Point(116.4074, 39.9042, 4326), 2000);

數據分區策略

-- 按地理區域分區
CREATE TABLE orders_partitioned (id SERIAL,user_id INTEGER,restaurant_id INTEGER,delivery_location GEOMETRY(POINT, 4326),order_time TIMESTAMP,region_code INTEGER
) PARTITION BY RANGE (region_code);-- 創建分區表
CREATE TABLE orders_beijing PARTITION OF orders_partitionedFOR VALUES FROM (1100) TO (1200);CREATE TABLE orders_shanghai PARTITION OF orders_partitionedFOR VALUES FROM (3100) TO (3200);

查詢優化技巧

-- 1. 使用邊界框預過濾
SELECT * FROM restaurants 
WHERE location && ST_MakeEnvelope(116.3, 39.8, 116.5, 40.0, 4326)  -- 邊界框過濾AND ST_DWithin(location, ST_Point(116.4074, 39.9042, 4326), 2000); -- 精確距離過濾-- 2. 避免不必要的坐標轉換
-- 好的做法:在同一坐標系中計算
SELECT ST_Distance(location1, location2) FROM table_name;
-- 不好的做法:頻繁轉換坐標系
SELECT ST_Distance(ST_Transform(location1, 3857), ST_Transform(location2, 3857)) FROM table_name;-- 3. 使用合適的幾何類型
-- 對于簡單的圓形范圍查詢,使用ST_DWithin而不是ST_Buffer + ST_Contains
SELECT * FROM restaurants 
WHERE ST_DWithin(location, user_location, 2000);  -- 推薦-- 而不是
SELECT * FROM restaurants 
WHERE ST_Contains(ST_Buffer(user_location, 2000), location);  -- 不推薦

第六部分:實戰項目:智能配送優化系統

讓我們整合所有知識,構建一個完整的智能配送優化系統:

-- 創建綜合配送優化函數
CREATE OR REPLACE FUNCTION optimize_delivery_assignment(user_location GEOMETRY,max_distance INTEGER DEFAULT 5000
) RETURNS TABLE(restaurant_id INTEGER,restaurant_name VARCHAR,driver_id INTEGER,driver_name VARCHAR,total_distance DECIMAL,estimated_time INTEGER,optimization_score DECIMAL
) AS $$
BEGINRETURN QUERYWITH available_restaurants AS (SELECT r.id,r.name,r.location,r.rating,ST_Distance(r.location, user_location) as distance_to_userFROM restaurants rWHERE ST_DWithin(r.location, user_location, max_distance)),available_drivers AS (SELECT d.id,d.name,d.current_location,d.vehicle_typeFROM drivers dWHERE d.is_available = true),delivery_combinations AS (SELECT ar.id as restaurant_id,ar.name as restaurant_name,ad.id as driver_id,ad.name as driver_name,ar.distance_to_user,ST_Distance(ad.current_location, ar.location) as driver_to_restaurant,ar.rating,CASE ad.vehicle_type WHEN '摩托車' THEN 1.5 WHEN '電動車' THEN 1.0 ELSE 0.8 END as speed_factorFROM available_restaurants arCROSS JOIN available_drivers ad)SELECT dc.restaurant_id,dc.restaurant_name,dc.driver_id,dc.driver_name,ROUND((dc.driver_to_restaurant + dc.distance_to_user)::DECIMAL / 1000, 2),ROUND((dc.driver_to_restaurant + dc.distance_to_user) / (500 * dc.speed_factor))::INTEGER,-- 綜合評分:考慮距離、餐廳評分、配送效率ROUND((10 - (dc.driver_to_restaurant + dc.distance_to_user) / 1000) * 0.4 +  -- 距離權重40%dc.rating * 0.3 +  -- 餐廳評分權重30%dc.speed_factor * 2 * 0.3,  -- 配送效率權重30%2)FROM delivery_combinations dcORDER BY optimization_score DESCLIMIT 10;
END;
$$ LANGUAGE plpgsql;-- 使用優化函數
SELECT * FROM optimize_delivery_assignment(ST_Point(116.4520, 39.9350, 4326),  -- 用戶位置3000  -- 最大搜索距離3公里
);

實時監控儀表板

-- 創建實時監控視圖
CREATE OR REPLACE VIEW delivery_dashboard AS
WITH real_time_stats AS (SELECT COUNT(*) as total_orders,COUNT(*) FILTER (WHERE order_time >= NOW() - INTERVAL '1 hour') as orders_last_hour,AVG(ST_Distance(r.location, o.delivery_location)) as avg_delivery_distance,COUNT(DISTINCT d.id) FILTER (WHERE d.is_available = true) as available_driversFROM orders oJOIN restaurants r ON o.restaurant_id = r.idLEFT JOIN drivers d ON trueWHERE o.order_time >= NOW() - INTERVAL '24 hours'
),
busy_areas AS (SELECT ST_SnapToGrid(delivery_location, 0.01) as grid_cell,COUNT(*) as order_densityFROM ordersWHERE order_time >= NOW() - INTERVAL '2 hours'GROUP BY ST_SnapToGrid(delivery_location, 0.01)ORDER BY order_density DESCLIMIT 5
)
SELECT rts.*,json_agg(json_build_object('longitude', ST_X(ba.grid_cell),'latitude', ST_Y(ba.grid_cell),'order_count', ba.order_density)) as hot_spots
FROM real_time_stats rts,busy_areas ba
GROUP BY rts.total_orders, rts.orders_last_hour, rts.avg_delivery_distance, rts.available_drivers;-- 查看實時監控數據
SELECT * FROM delivery_dashboard;

總結:PostGIS的空間數據革命

通過這篇文章的學習,我們從零開始構建了一個完整的空間數據應用系統。讓我們回顧一下PostGIS的核心價值:

技術優勢總結

  1. 原生空間支持:數據庫級別的地理數據處理
  2. 標準兼容:支持OGC標準,與各種GIS工具兼容
  3. 高性能:空間索引和優化算法保證查詢效率
  4. 功能豐富:數百個空間函數覆蓋各種應用場景
  5. 擴展性強:可以處理從簡單LBS到復雜GIS的各種需求

應用場景回顧

應用領域核心功能關鍵技術
位置服務附近搜索、路徑規劃ST_DWithin, ST_Distance
智慧城市交通分析、環境監測空間聚合、熱力圖分析
物流配送路線優化、區域管理緩沖區分析、網絡分析
應急響應資源調度、影響評估最近鄰查詢、空間關系

最佳實踐指南

  1. 合理選擇坐標系:地理坐標系用于存儲,投影坐標系用于計算
  2. 創建空間索引:所有空間字段都應該有GIST索引
  3. 優化查詢策略:使用邊界框預過濾,避免不必要的坐標轉換
  4. 數據分區管理:大規模數據按地理區域分區
  5. 監控性能指標:定期分析查詢性能,優化慢查詢

發展趨勢展望

PostGIS正在向更智能、更高效的方向發展:

  • 3D空間分析:支持三維地理數據處理
  • 時空數據:集成時間維度的空間分析
  • 機器學習集成:空間數據的AI分析能力
  • 實時流處理:支持實時地理數據流分析
  • 云原生優化:更好的云環境性能表現

PostGIS不僅僅是一個數據庫擴展,它是連接現實世界與數字世界的橋梁。無論你是在開發下一個獨角獸級別的LBS應用,還是在構建智慧城市的基礎設施,PostGIS都將是你最可靠的技術伙伴。

下一篇預告:《PostgreSQL性能調優深度實戰:從查詢優化到服務器配置》

我們將深入探討PostgreSQL的性能優化技巧,從SQL查詢優化到服務器參數調優,從索引策略到連接池配置,幫你構建高性能的數據庫系統。


如果這篇文章對你有幫助,歡迎點贊、收藏和分享。有任何問題或建議,歡迎在評論區討論!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85311.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85311.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85311.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

科技修真的解決方案

“科技修真”是一個結合現代科技與修真&#xff08;玄幻&#xff09;元素的創新概念&#xff0c;通常出現在科幻或玄幻文學作品中&#xff0c;但也可能指代現實中的科技與傳統文化、超自然理念的融合探索。以下是幾種可能的“科技修真”方案&#xff0c;涵蓋技術實現、文化融合…

STM32的HAL編碼流程總結(上部)

目錄 一、GPIO二、中斷系統三、USART串口通信四、I2C通信五、定時器 一、GPIO 1.選擇調試類型 在SYS中Debug選擇Serial Wire模式 2.選擇時鐘源 在RCC中將HSE和LSH都選擇為內部晶振 3.時鐘樹配置 4.GPIO配置 在芯片圖上選擇開啟的引腳和其功能 配置引腳的各自屬性 5.工…

java直接獲取MyBatis將要執行的動態sql命令(不是攔截器方式)

目錄 前言 一. 準備數據 1. 傳輸過來的json條件數據 2. mybatis 配置的動態sql 3. 想要的最終會執行的sql并返回給頁面展示 二. 實現方式 三. 最終代碼 前言 1.在平常開發過程中,MyBatis使用時非常多的,一般情況下我們只需要在控制臺看看MyBatis輸出的日志,要不就是實…

機器學習算法-決策樹

今天我們用一個 「相親決策」 的例子來講解決策樹算法&#xff0c;保證你輕松理解原理和實現&#xff01; &#x1f333; 決策樹是什么&#xff1f; 決策樹就像玩 「20個問題」猜謎游戲&#xff1a; 你心里想一個東西&#xff08;比如「蘋果」&#xff09; 朋友通過一系列問題…

2025——》VSCode Windows 最新安裝指南/VSCode安裝完成后如何驗證是否成功?2025最新VSCode安裝配置全攻略

1.VSCode Windows 最新安裝指南: 以下是 2025 年 Windows 系統下安裝 Visual Studio Code(VSCode)的最新指南,結合官方文檔與實際操作經驗整理而成: 一、下載官方安裝包: 1.訪問官網: 打開瀏覽器,進入 VSCode 官方下載頁面https://code.visualstudio.com/Download 2…

【Elasticsearch】suggest

在Elasticsearch中&#xff0c;suggest 是一個非常強大的功能&#xff0c;用于實現自動補全、拼寫糾錯和模糊搜索等功能。它可以幫助用戶更快地找到他們想要的內容&#xff0c;同時提升搜索體驗。以下是關于 suggest 的詳細使用方法和常見場景。 1\. Suggest 的基本概念 sugges…

[SAP] 如何查詢當前屏幕的Tcode?

事務代碼Tcode是SAP中到達特定屏幕的快捷路徑 如何查詢以下屏幕的事務碼Tcode&#xff1f; 要瀏覽當前所使用的屏幕的事務碼&#xff0c;可以選擇System | Status 這里的事務代碼是[VA22]&#xff0c;它是Change Quotation的事務代碼

PostgreSQL的擴展 dblink

PostgreSQL的擴展 dblink dblink 是 PostgreSQL 的一個核心擴展&#xff0c;允許在當前數據庫中訪問其他 PostgreSQL 數據庫的數據&#xff0c;實現跨數據庫查詢功能。 一、dblink 擴展安裝與啟用 1. 安裝擴展 -- 使用超級用戶安裝 CREATE EXTENSION dblink;2. 驗證安裝 -…

ADB推送文件到指定路徑解析

您執行的命令 adb push ota.zip /sdcard/Download 中&#xff0c;目標路徑 /sdcard/Download 是您顯式指定的&#xff0c;因此 ADB 會直接將文件推送到此位置。具體過程如下&#xff1a; 1. 命令結構解析 adb push&#xff1a;ADB 的推送指令。ota.zip&#xff1a;本地計算機上…

Linux 內核中 skb_orphan 的深度解析:從版本差異到核心機制

引言 在 Linux 內核網絡子系統中,struct sk_buff(簡稱 skb)是管理網絡數據包的核心數據結構。skb_orphan 作為其生命周期管理的關鍵函數,負責切斷 skb 與所屬 socket 的關聯,確保數據包在復雜處理流程中的獨立性。本文將從代碼實現、版本差異、使用場景等多個維度,深入解…

03.MySQL表的操作詳解

MySQL表的操作詳解 MySQL 表的操作概述創建表 2.1 創建表的基本語法查看表結構修改表 4.1 新增列 4.2 修改列屬性 4.3 修改列名 4.4 修改表名 4.5 刪除列刪除表 1. MySQL表的操作概述 MySQL表的操作是數據庫開發和管理中的核心內容&#xff0c;主要涉及**數據定義語言&#…

Flink系列文章列表

把寫的文章做一個匯總&#xff0c;會陸續更新的。 Flink流處理原理與實踐&#xff1a;狀態管理、窗口操作與容錯機制-CSDN博客

【目標檢測】【AAAI-2022】Anchor DETR

Anchor DETR&#xff1a; Query Design for Transformer-Based Object Detection 錨點DETR&#xff1a;基于Transformer的目標檢測查詢設計 論文鏈接 代碼鏈接 摘要 在本文中&#xff0c;我們提出了一種基于Transformer的目標檢測新型查詢設計。此前的Transformer檢測器中&am…

apptrace 的優勢以及對 App 的價值

官網地址&#xff1a;AppTrace - 專業的移動應用推廣追蹤平臺 apptrace 的優勢以及對 App 的價值? App 拉起作為移動端深度鏈接技術的關鍵應用&#xff0c;能實現從 H5 網頁到 App 的無縫跳轉&#xff0c;并精準定位到 App 內指定頁面。apptrace 憑借專業的技術與豐富的經驗…

16-前端Web實戰(Tlias案例-部門管理)

在前面的課程中&#xff0c;我們學習了Vue工程化的基礎內容、TS、ElementPlus&#xff0c;那接下來呢&#xff0c;我們要通過一個案例&#xff0c;加強大家對于Vue項目的理解&#xff0c;并掌握Vue項目的開發。 這個案例呢&#xff0c;就是我們之前所做的Tlias智能學習輔助系統…

Python爬蟲實戰:研究Goutte庫相關技術

1. 引言 1.1 研究背景與意義 隨著互聯網信息的爆炸式增長,如何高效、準確地獲取和分析 Web 數據成為重要研究課題。網絡爬蟲作為自動獲取網頁內容的關鍵技術,在搜索引擎優化、輿情分析、市場調研等領域具有廣泛應用。然而,現代網站越來越多地采用 JavaScript 動態渲染技術…

Python----目標檢測(《基于區域提議網絡的實時目標檢測方法》和Faster R-CNN)

一、《基于區域提議網絡的實時目標檢測方法》 1.1、基本信息 標題&#xff1a;Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 作者&#xff1a;任少卿&#xff08;中國科學技術大學、微軟研究院&#xff09;、何凱明&#xff08;微軟研究…

吳恩達講解MCP基礎概念

簡介 MCP 是一個開放協議 標準化了您的語言模型應用如何獲取工具和數據資源的上下文。基于客戶端-服務器架構,它定義了您的語言模型應用中的MCP客戶端與MCP服務器之間的通信方式,MCP服務器提供工具 數據資源和提示模板給您的應用,自Anthropic于2024年11月推出MCP以來,MCP生…

Git入門到精通:30分鐘掌握核心技巧

目錄 一、基礎理論片 Git簡介 Git安裝 Git倉庫 Git基本命令用法 倉庫別名 二、實操命令篇 遠程分支 分支的新建和合并 實操演示 1 本地新建倉庫 2 gitee新建倉庫 3 建立關系 4 新建分支 5 開發新功能 6 推送新分支 7 合并新分支到主分支 三、可視化工具篇 G…

零基礎設計模式——結構型模式 - 代理模式

第三部分&#xff1a;結構型模式 - 代理模式 (Proxy Pattern) 在學習了享元模式如何通過共享對象來優化資源使用后&#xff0c;我們來探討結構型模式的最后一個模式——代理模式。代理模式為另一個對象提供一個替身或占位符以控制對這個對象的訪問。 核心思想&#xff1a;為其…