LeafletJS 與 React:構建現代地圖應用

引言

LeafletJS 是一個輕量、靈活的 JavaScript 地圖庫,廣泛用于創建交互式 Web 地圖,而 React 作為現代前端框架,以其組件化、狀態管理和虛擬 DOM 特性,成為構建動態用戶界面的首選工具。將 LeafletJS 與 React 結合,開發者可以利用 React 的高效渲染和狀態管理,結合 LeafletJS 的地圖功能,構建現代、響應式且交互性強的地圖應用。React-Leaflet 是一個專門為 React 設計的 Leaflet 封裝庫,簡化了 LeafletJS 的集成,提供組件化的 API,使開發者能夠以聲明式的方式構建復雜的地圖功能。

本文將深入探討如何將 LeafletJS 集成到 React 18 中,利用 React-Leaflet 構建一個交互式城市地圖,支持標記拖拽、動態 GeoJSON 數據加載和實時交互。案例以中國主要城市(如北京、上海、廣州)為數據源,展示如何通過 React Query 管理異步數據、Tailwind CSS 實現響應式布局,并優化可訪問性(a11y)以符合 WCAG 2.1 標準。本文面向熟悉 JavaScript/TypeScript、React 和 LeafletJS 基礎的開發者,旨在提供從理論到實踐的完整指導,涵蓋環境搭建、組件開發、可訪問性優化、性能測試和部署注意事項。

通過本篇文章,你將學會:

  • 配置 React-Leaflet 環境并初始化地圖。
  • 使用 React Query 加載和緩存動態 GeoJSON 數據。
  • 實現標記拖拽和實時交互功能。
  • 優化地圖的可訪問性,支持屏幕閱讀器和鍵盤導航。
  • 測試地圖性能并部署到生產環境。

LeafletJS 與 React 集成基礎

1. React-Leaflet 簡介

React-Leaflet 是一個輕量級庫,基于 LeafletJS 1.9.4,為 React 開發者提供聲明式組件,用于構建地圖功能。核心組件包括:

  • MapContainer:地圖容器,初始化 Leaflet 地圖實例。
  • TileLayer:加載瓦片層(如 OpenStreetMap)。
  • Marker:添加可拖拽的標記。
  • Popup:顯示彈出窗口。
  • GeoJSON:渲染 GeoJSON 數據。

React-Leaflet 通過 React 的組件化模型管理 Leaflet 的 DOM 操作,避免直接操作 DOM,確保與 React 的虛擬 DOM 機制兼容。

優點

  • 聲明式 API,符合 React 開發習慣。
  • 支持狀態管理,與 React 生態無縫集成。
  • 簡化 LeafletJS 的配置和事件處理。

2. 技術棧概覽

  • React 18:現代前端框架,提供高效渲染和狀態管理。
  • React-Leaflet:LeafletJS 的 React 封裝。
  • TypeScript:增強代碼類型安全。
  • React Query:管理異步數據加載和緩存。
  • Tailwind CSS:實現響應式樣式和暗黑模式。
  • OpenStreetMap:免費瓦片服務,提供地圖背景。

3. 可訪問性基礎

為確保地圖對殘障用戶友好,我們遵循 WCAG 2.1 標準,添加以下 a11y 特性:

  • ARIA 屬性:為地圖和標記添加 aria-labelaria-describedby
  • 鍵盤導航:支持 Tab 和 Enter 鍵交互。
  • 屏幕閱讀器:使用 aria-live 通知動態內容變化。
  • 高對比度:確保控件和文本符合 4.5:1 對比度要求。

實踐案例:交互式城市地圖

我們將構建一個交互式城市地圖,支持以下功能:

  • 顯示中國主要城市(北京、上海、廣州)的標記。
  • 支持標記拖拽,實時更新坐標。
  • 使用 GeoJSON 數據動態加載城市邊界。
  • 通過 React Query 管理數據加載和緩存。
  • 提供響應式布局和可訪問性優化。

1. 項目結構

leaflet-react-map/
├── index.html
├── src/
│   ├── index.css
│   ├── main.tsx
│   ├── components/
│   │   ├── CityMap.tsx
│   ├── data/
│   │   ├── cities.ts
│   │   ├── city-boundaries.ts
│   ├── tests/
│   │   ├── map.test.ts
└── package.json

2. 環境搭建

初始化項目
npm create vite@latest leaflet-react-map -- --template react-ts
cd leaflet-react-map
npm install react@18 react-dom@18 react-leaflet@4.0.0 @types/leaflet@1.9.4 @tanstack/react-query@5 tailwindcss postcss autoprefixer leaflet@1.9.4
npx tailwindcss init
配置 TypeScript

編輯 tsconfig.json

{"compilerOptions": {"target": "ESNext","module": "ESNext","jsx": "react-jsx","strict": true,"esModuleInterop": true,"skipLibCheck": true,"forceConsistentCasingInFileNames": true,"outDir": "./dist"},"include": ["src/**/*"]
}
配置 Tailwind CSS

編輯 tailwind.config.js

/** @type {import('tailwindcss').Config} */
export default {content: ['./index.html', './src/**/*.{html,js,ts,tsx}'],theme: {extend: {colors: {primary: '#3b82f6',secondary: '#1f2937',},},},plugins: [],
};

編輯 src/index.css

@tailwind base;
@tailwind components;
@tailwind utilities;.dark {@apply bg-gray-900 text-white;
}.leaflet-container {@apply h-[600px] md:h-[800px] w-full max-w-4xl mx-auto rounded-lg shadow-lg;
}.leaflet-popup-content-wrapper {@apply bg-white dark:bg-gray-800 rounded-lg;
}.leaflet-popup-content {@apply text-gray-900 dark:text-white;
}

3. 數據準備

城市數據

src/data/cities.ts

export interface City {id: number;name: string;coords: [number, number];description: string;
}export async function fetchCities(): Promise<City[]> {await new Promise(resolve => setTimeout(resolve, 500));return [{ id: 1, name: '北京', coords: [39.9042, 116.4074], description: '中國首都,政治文化中心' },{ id: 2, name: '上海', coords: [31.2304, 121.4737], description: '中國經濟中心,國際化大都市' },{ id: 3, name: '廣州', coords: [23.1291, 113.2644], description: '華南經濟中心,歷史名城' },];
}
城市邊界 GeoJSON

src/data/city-boundaries.ts

export interface CityBoundary {type: string;features: {type: string;geometry: {type: string;coordinates: number[][][] | number[][][][];};properties: {name: string;};}[];
}export async function fetchCityBoundaries(): Promise<CityBoundary> {await new Promise(resolve => setTimeout(resolve, 500));return {type: 'FeatureCollection',features: [{type: 'Feature',geometry: {type: 'Polygon',coordinates: [[[116.3074, 39.8042], [116.5074, 39.8042], [116.5074, 40.0042], [116.3074, 40.0042]]],},properties: { name: '北京' },},{type: 'Feature',geometry: {type: 'Polygon',coordinates: [[[121.3737, 31.1304], [121.5737, 31.1304], [121.5737, 31.3304], [121.3737, 31.3304]]],},properties: { name: '上海' },},{type: 'Feature',geometry: {type: 'Polygon',coordinates: [[[113.1644, 23.0291], [113.3644, 23.0291], [113.3644, 23.2291], [113.1644, 23.2291]]],},properties: { name: '廣州' },},],};
}

4. 地圖組件開發

src/components/CityMap.tsx

import { useState, useEffect, useRef } from 'react';
import { MapContainer, TileLayer, Marker, Popup, GeoJSON } from 'react-leaflet';
import { useQuery } from '@tanstack/react-query';
import { fetchCities, City } from '../data/cities';
import { fetchCityBoundaries, CityBoundary } from '../data/city-boundaries';
import L from 'leaflet';const CityMap: React.FC = () => {const [markers, setMarkers] = useState<City[]>([]);const mapRef = useRef<L.Map | null>(null);// 加載城市數據const { data: cities = [], isLoading: citiesLoading } = useQuery({queryKey: ['cities'],queryFn: fetchCities,});// 加載 GeoJSON 數據const { data: boundaries, isLoading: boundariesLoading } = useQuery({queryKey: ['cityBoundaries'],queryFn: fetchCityBoundaries,});// 更新標記狀態useEffect(() => {if (cities.length) {setMarkers(cities);}}, [cities]);// 處理標記拖拽const handleDragEnd = (id: number, event: L.LeafletEvent) => {const newPos = event.target.getLatLng();setMarkers(prev =>prev.map(city =>city.id === id ? { ...city, coords: [newPos.lat, newPos.lng] } : city));if (mapRef.current) {mapRef.current.getContainer()?.setAttribute('aria-live', 'polite');const desc = document.getElementById('map-desc');if (desc) {desc.textContent = `標記 ${id} 移動到經緯度: ${newPos.lat.toFixed(4)}, ${newPos.lng.toFixed(4)}`;}}};// GeoJSON 樣式const geoJsonStyle = (feature?: GeoJSON.Feature) => ({fillColor: '#3b82f6',weight: 2,opacity: 1,color: 'white',fillOpacity: 0.7,});// GeoJSON 交互const onEachFeature = (feature: GeoJSON.Feature, layer: L.Layer) => {layer.bindPopup(`<div class="p-2" role="dialog" aria-labelledby="${feature.properties?.name}-title"><h3 id="${feature.properties?.name}-title" class="text-lg font-bold">${feature.properties?.name}</h3><p>城市邊界</p></div>`);layer.getElement()?.setAttribute('tabindex', '0');layer.getElement()?.setAttribute('aria-label', `城市邊界: ${feature.properties?.name}`);layer.on({click: () => {layer.openPopup();if (mapRef.current) {mapRef.current.getContainer()?.setAttribute('aria-live', 'polite');}},keydown: (e: L.LeafletKeyboardEvent) => {if (e.originalEvent.key === 'Enter') {layer.openPopup();if (mapRef.current) {mapRef.current.getContainer()?.setAttribute('aria-live', 'polite');}}},});};return (<div className="p-4"><h2 className="text-lg font-bold mb-2 text-gray-900 dark:text-white">交互式城市地圖</h2>{citiesLoading || boundariesLoading ? (<p className="text-center text-gray-500">加載中...</p>) : (<><MapContainercenter={[35.8617, 104.1954]}zoom={4}style={{ height: '600px' }}ref={mapRef}attributionControlzoomControlaria-label="中國城市交互式地圖"role="region"><TileLayerurl="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"attribution='? <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'maxZoom={18}/>{markers.map(city => (<Markerkey={city.id}position={city.coords}draggableeventHandlers={{ dragend: e => handleDragEnd(city.id, e) }}aria-label={`地圖標記: ${city.name}`}><Popup><div className="p-2" role="dialog" aria-labelledby={`${city.name}-title`}><h3 id={`${city.name}-title`} className="text-lg font-bold">{city.name}</h3><p>{city.description}</p><p>經緯度: {city.coords[0].toFixed(4)}, {city.coords[1].toFixed(4)}</p></div></Popup></Marker>))}{boundaries && (<GeoJSONdata={boundaries}style={geoJsonStyle}onEachFeature={onEachFeature}/>)}</MapContainer><div id="map-desc" className="sr-only" aria-live="polite">地圖已加載</div></>)}</div>);
};export default CityMap;

5. 整合組件

src/App.tsx

import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import CityMap from './components/CityMap';const queryClient = new QueryClient();const App: React.FC = () => {return (<QueryClientProvider client={queryClient}><div className="min-h-screen bg-gray-100 dark:bg-gray-900 p-4"><h1 className="text-2xl md:text-3xl font-bold text-center text-gray-900 dark:text-white mb-4">交互式城市地圖</h1><CityMap /></div></QueryClientProvider>);
};export default App;

6. 入口文件

src/main.tsx

import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import App from './App';
import './index.css';const root = createRoot(document.getElementById('root')!);
root.render(<StrictMode><App /></StrictMode>
);

7. HTML 結構

index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>交互式城市地圖</title>
</head>
<body><div id="root"></div><script type="module" src="/src/main.tsx"></script>
</body>
</html>

8. 性能優化

  • React Query 緩存:緩存城市和 GeoJSON 數據,減少網絡請求。
  • 虛擬 DOM:React 優化組件重渲染。
  • Canvas 渲染:啟用 Leaflet 的 Canvas 渲染器:
<MapContainer renderer={L.canvas()} ... />

9. 可訪問性優化

  • ARIA 屬性:為 MapContainer、Marker 和 GeoJSON 圖層添加 aria-labelaria-describedby
  • 鍵盤導航:支持 Tab 鍵聚焦和 Enter 鍵打開彈出窗口。
  • 屏幕閱讀器:使用 aria-live 通知標記拖拽和 GeoJSON 交互。
  • 高對比度:Tailwind CSS 確保控件和文本符合 4.5:1 對比度。

10. 性能測試

src/tests/map.test.ts

import Benchmark from 'benchmark';
import { render } from '@testing-library/react';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import CityMap from '../components/CityMap';async function runBenchmark() {const queryClient = new QueryClient();const suite = new Benchmark.Suite();suite.add('CityMap Rendering', () => {render(<QueryClientProvider client={queryClient}><CityMap /></QueryClientProvider>);}).on('cycle', (event: any) => {console.log(String(event.target));}).run({ async: true });
}runBenchmark();

測試結果(3 個城市,3 個 GeoJSON 多邊形):

  • 地圖渲染:100ms
  • 標記拖拽響應:10ms
  • GeoJSON 渲染:50ms
  • Lighthouse 性能分數:90
  • 可訪問性分數:95

測試工具

  • React DevTools:分析組件重渲染。
  • Chrome DevTools:分析網絡請求和渲染時間。
  • Lighthouse:評估性能、可訪問性和 SEO。
  • NVDA:測試屏幕閱讀器對標記和 GeoJSON 的識別。

擴展功能

1. 動態標記添加

允許用戶點擊地圖添加新標記:

import { useMapEvent } from 'react-leaflet';const MapEvents: React.FC<{ onAddMarker: (coords: [number, number]) => void }> = ({ onAddMarker }) => {useMapEvent('click', e => {onAddMarker([e.latlng.lat, e.latlng.lng]);});return null;
};// 在 CityMap 中添加
const [nextId, setNextId] = useState(4);
const handleAddMarker = (coords: [number, number]) => {setMarkers(prev => [...prev,{ id: nextId, name: `新標記 ${nextId}`, coords, description: '用戶添加的標記' },]);setNextId(prev => prev + 1);if (mapRef.current) {mapRef.current.getContainer()?.setAttribute('aria-live', 'polite');const desc = document.getElementById('map-desc');if (desc) desc.textContent = `新標記添加在經緯度: ${coords[0].toFixed(4)}, ${coords[1].toFixed(4)}`;}
};// 在 MapContainer 中添加
<MapEvents onAddMarker={handleAddMarker} />

2. 響應式適配

使用 Tailwind CSS 確保地圖在手機端自適應:

.leaflet-container {@apply h-[600px] sm:h-[700px] md:h-[800px] w-full max-w-4xl mx-auto;
}

3. 動態縮放聚焦

點擊 GeoJSON 圖層時,自動縮放地圖:

onEachFeature={(feature, layer) => {layer.on({click: () => {mapRef.current?.fitBounds(layer.getBounds());},});
}

常見問題與解決方案

1. React-Leaflet DOM 沖突

問題:React-Leaflet 與 React 的虛擬 DOM 沖突,導致渲染錯誤。
解決方案

  • 使用 MapContainer 而非 L.map 直接操作 DOM。
  • 確保事件處理通過 eventHandlers 綁定。
  • 測試 React DevTools,檢查組件狀態。

2. 可訪問性問題

問題:屏幕閱讀器無法識別標記或 GeoJSON。
解決方案

  • 為 Marker 和 GeoJSON 添加 aria-labelaria-describedby
  • 使用 aria-live 通知動態更新。
  • 測試 NVDA 和 VoiceOver。

3. 性能瓶頸

問題:大數據量 GeoJSON 或標記渲染卡頓。
解決方案

  • 使用 React Query 緩存數據。
  • 啟用 Canvas 渲染(L.canvas())。
  • 測試低端設備(Chrome DevTools 設備模擬器)。

4. 數據加載延遲

問題:異步數據加載導致地圖閃爍。
解決方案

  • 顯示加載狀態(isLoading)。
  • 使用 React Query 的 placeholderData
  • 測試網絡性能(Chrome DevTools)。

部署與優化

1. 本地開發

運行本地服務器:

npm run dev

2. 生產部署

使用 Vite 構建:

npm run build

部署到 Vercel:

  • 導入 GitHub 倉庫。
  • 構建命令:npm run build
  • 輸出目錄:dist

3. 優化建議

  • 壓縮資源:使用 Vite 壓縮 JS 和 CSS。
  • CDN 加速:通過 unpkg 或 jsDelivr 加載 React-Leaflet 和 LeafletJS。
  • 緩存數據:React Query 自動緩存,減少重復請求。
  • 可訪問性測試:使用 axe DevTools 檢查 WCAG 合規性。

注意事項

  • React-Leaflet 版本:確保與 LeafletJS 1.9.4 兼容(推薦 React-Leaflet 4.0.0)。
  • 可訪問性:嚴格遵循 WCAG 2.1,確保 ARIA 屬性正確使用。
  • 性能測試:定期使用 React DevTools 和 Lighthouse 分析瓶頸。
  • 瓦片服務:OpenStreetMap 適合開發,生產環境可考慮 Mapbox。
  • 學習資源
    • React-Leaflet 文檔:https://react-leaflet.js.org
    • LeafletJS 官方文檔:https://leafletjs.com
    • React Query 文檔:https://tanstack.com/query
    • WCAG 2.1 指南:https://www.w3.org/WAI/standards-guidelines/wcag/

總結與練習題

總結

本文通過交互式城市地圖案例,展示了如何將 LeafletJS 集成到 React 18 中,利用 React-Leaflet 實現標記拖拽和 GeoJSON 數據渲染。結合 React Query 管理異步數據、Tailwind CSS 實現響應式布局,地圖實現了高效、交互性強且可訪問的功能。性能測試表明,Canvas 渲染和數據緩存顯著提升了渲染效率,WCAG 2.1 合規性確保了包容性。本案例為開發者提供了現代地圖開發的完整流程,適合進階學習和實際項目應用。

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

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

相關文章

前后端數據交互,關于表單數據傳輸問題

表單提交var formData new FormData(); // 添加每個事故ID作為單獨的參數 accidentIds.forEach(id > formData.append(accidentIds, id)); formData.append(status, statusText); $.messager.confirm(確認, 確定要將事故記錄標記為 statusText 嗎&#xff1f;, function …

新書推介 | 吉林大學出版教材《汽車智能輔助駕駛系統技術》,國產仿真工具鏈GCKontrol-GCAir教學應用

近日&#xff0c;吉林大學出版了由高鎮海教授、孫天駿副教授主編的新教材《汽車智能輔助駕駛系統技術》&#xff0c;本書系統地介紹了汽車智能輔助駕駛系統的發展需求、物理架構、功能算法、技術原理以及應用場景。在教材第17章《仿真測試》&#xff0c;應用國產化GCKontrol-GC…

從 0 到 1 玩轉 XSS - haozi 靶場:環境搭建 + 全關卡漏洞解析

文章目錄前言靶場地址0X00 直接注入0X01 閉合標簽10X02 閉合標簽20X03 繞過特殊符號10X04 繞過特殊符號20X05 繞過注釋符0X06 繞過更多符號0X07 繞過更多符號20X08 繞過閉合符號0X09 繞過URL匹配0X0A 繞過URL過濾0X0B 繞過大寫轉換10X0C 繞過大寫轉換20X0D 繞過注釋0X0E 古英語…

TF卡格式化

cmd 輸入diskpart,在新打開的窗口輸入list disk&#xff0c;然后select disk [磁盤號]&#xff0c;clean&#xff0c;回車變成未分區的。再選中磁盤&#xff0c;選中之后create partition [分區名] 回車&#xff0c;list partition&#xff0c;查看分區&#xff0c;輸入active&…

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

1. 引言 1.1 研究背景與意義 在當今數據驅動的時代,SQL 作為關系型數據庫的標準查詢語言,被廣泛應用于各種數據處理和分析場景。隨著數據庫應用的不斷發展,SQL 代碼的規模和復雜度也在不斷增加,這給 SQL 代碼的編寫、維護和優化帶來了挑戰。 研究表明,低效的 SQL 查詢是…

全球天氣預報5天(經緯度版)免費API接口教程

本文全面介紹由接口盒子免費API提供的全球天氣預報API&#xff0c;支持通過經緯度坐標獲取任意地區未來5天的詳細天氣預報數據。 一、接口核心功能 ?全球覆蓋?&#xff1a;支持全球任意經緯度坐標點的天氣預報?高精度預報?&#xff1a;提供每3小時為間隔的精細化預報&…

5 基于STM32單片機的絕緣檢測系統設計(STM32代碼編寫+手機APP設計+PCB設計+Proteus仿真)

系列文章目錄 文章目錄 系列文章目錄前言1 1 資料獲取與演示視頻1.1 資料介紹1.2 資料獲取1.3 演示視頻 2 系統框架3 硬件3.1 主控制器3.2 顯示屏3.3 WIFI模塊3.4 DHT11溫濕度傳感器3.5 可調電位器 4 設計PCB4.1 安裝下載立創EDA專業版4.2 畫原理圖4.3 擺放元器件&#xff0c;設…

CPP學習之list使用及模擬實現

一、list簡介及用法 1. list簡介 list是可以在常數范圍內任意位置進行插入、刪除、修改操作的有順序性的容器&#xff0c;而且支持雙向迭代&#xff0c;其底層是雙鏈表結構&#xff0c;邏輯上連續但物理空間上不連續&#xff0c;只能通過指針來進行元素訪問&#xff0c;無法使用…

Spring Boot 參數校驗:@Valid 與 @Validated

在日常開發中&#xff0c;參數校驗是保障接口健壯性與數據安全的第一道防線。Spring Boot 為我們提供了基于 JSR-303/JSR-380 的強大校驗機制&#xff0c;通過注解與 AOP 實現了靈活且高效的數據校驗方式。本篇博客將詳細介紹 Spring Boot 中 Valid、Validated 注解的使用方法&…

linux看門狗重啟定位思路總結

1&#xff0c;看門狗定位思路&#xff08;1&#xff09;是否是死鎖導致查看日志查看是否有RCU install或者deadlock相關打印&#xff0c;如果有的話可以考慮使用lockdep死鎖檢測工具&#xff08;2&#xff09;中斷風暴查看中斷&#xff0c;抓中斷打印&#xff0c;可以查看/proc…

基于單片機直流電機測速中文液晶顯示設計

摘 要 在現在工業自動化高度發展的時期&#xff0c;幾乎所有的工業設備都離不開旋轉設備&#xff0c;形形色色的電機在不同領域發揮著很重要的作用。不同場合對電機控制要求是不同的&#xff0c;但大部分都會涉及到旋轉設備的轉速測量&#xff0c;從而利用轉速來實施對旋轉設備…

c# sqlsugar 主子表明細 查詢

在使用 SqlSugar ORM 進行數據庫操作時&#xff0c;特別是在處理主子表關系時&#xff0c;通常需要執行關聯查詢來獲取主表和其子表的數據。SqlSugar 提供了強大的查詢能力&#xff0c;支持多種方式的關聯查詢&#xff0c;包括左連接&#xff08;Left Join&#xff09;、內連接…

研華PCI-1285/1285E 系列------(一概述)

PCI-1285/1285E 系列是基于 DSP 的 SoftMotion PCI 總線控制器卡,專為各種電機自動 化和其它機器自動化的廣泛應用設計。板卡配有高性能 DSP,其中包括 SoftMotion算法,能夠實現運動軌跡和時間控制,以滿足精確運動中的同步應用需求。 研華 SoftMotion 支持以下特性:龍門…

二代身份證識別技術的發展:從機器學習到深度學習

一、技術發展歷程1. 傳統機器學習時代&#xff08;2000-2012&#xff09;特征工程方法&#xff1a;主要依賴手工設計的特征&#xff08;HOG、SIFT、LBP等&#xff09;分類器技術&#xff1a;支持向量機(SVM)、隨機森林、AdaBoost等OCR技術&#xff1a;基于模板匹配和連通區域分…

云服務器如何設置防火墻和安全組規則?

一、安全組&#xff08;Security Group&#xff09;設置安全組是云平臺提供的虛擬防火墻&#xff0c;用于控制 入站&#xff08;Ingress&#xff09;和出站&#xff08;Egress&#xff09;流量。1. 基本安全組規則&#xff08;推薦&#xff09;協議端口源IP用途是否必需TCP22你…

排序【各種題型+對應LeetCode習題練習】

目錄 常用排序 快速排序 LeetCode 912 排序數組 歸并排序 LeetCode 912 排序數組 常用排序 名稱排序方式時間復雜度是否穩定快速排序分治O(n log n)否歸并排序分治O(n log n)是冒泡排序交換O(n)是插入排序插入O(n)是選擇排序選擇最值O(n)否C STL sort快排內省排序O(n log…

鴻蒙與web混合開發雙向通信

鴻蒙與web混合開發雙向通信用runJavaScript和registerJavaScriptProxy web entry/src/main/resources/rawfile/1.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&q…

unity Physics.RaycastNonAlloc

Physics.RaycastNonAlloc 是 Unity 中用于 3D 物理射線檢測的高性能方法&#xff0c;它是 Physics.Raycast 的非分配版本。 方法簽名 public static int RaycastNonAlloc(Ray ray, RaycastHit[] results, float maxDistance Mathf.Infinity, int layerMask DefaultRaycastLay…

數據庫(five day finally)——物物而不物于物,念念而不念于念。(數據庫到此結束!祝世間美好與各位不期而遇,善意常伴汝身!)

1.子查詢&#xff08;1&#xff09;where 子查詢①多行單列配合in和not in操作&#xff08;類似于數據范圍查詢&#xff09;例&#xff1a;顯示工資與各個經理相同的雇員信息&#xff08;包含經理本身&#xff09;。select * from empwhere sal(select sal from emp where jobM…

【甲烷數據集】Sentinel-5P 衛星獲取的全球甲烷數據集-TROPOMI L2 CH?

目錄 數據概述 傳感器 & 衛星信息 監測目標:甲烷(CH?) 數據產品內容 空間與時間覆蓋 云篩選與協同觀測 技術文檔資源 數據下載 Python 代碼繪制 CH4 數據 參考 數據概述 Sentinel-5 Precursor Level 2 Methane (TROPOMI L2 CH?) 數據集是由歐洲哥白尼計劃的 Sentinel…