diff --git a/components/Map.js b/components/Map.js
new file mode 100644
index 0000000..d63f936
--- /dev/null
+++ b/components/Map.js
@@ -0,0 +1,31 @@
+import { MapContainer, TileLayer, Marker, Popup } from 'react-leaflet';
+import 'leaflet/dist/leaflet.css';
+import L from 'leaflet';
+
+// Убедитесь, что иконка маркера отображается правильно
+delete L.Icon.Default.prototype._getIconUrl;
+L.Icon.Default.mergeOptions({
+ iconRetinaUrl: '/leaflet/images/marker-icon-2x.png',
+ iconUrl: '/leaflet/images/marker-icon.png',
+ shadowUrl: '/leaflet/images/marker-shadow.png',
+});
+
+const Map = () => {
+ const position = [51.505, -0.09]; // Координаты для центра карты
+
+ return (
+
+
+
+
+ A pretty CSS3 popup.
Easily customizable.
+
+
+
+ );
+};
+
+export default Map;
\ No newline at end of file
diff --git a/eslint.config.mjs b/eslint.config.mjs
index c85fb67..fea3594 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -14,3 +14,4 @@ const eslintConfig = [
];
export default eslintConfig;
+
diff --git a/package-lock.json b/package-lock.json
index f2ddac7..021cdb6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,9 +8,11 @@
"name": "my-qgis-app",
"version": "0.1.0",
"dependencies": {
+ "leaflet": "^1.9.4",
"next": "15.2.3",
"react": "^19.0.0",
- "react-dom": "^19.0.0"
+ "react-dom": "^19.0.0",
+ "react-leaflet": "^5.0.0"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
@@ -840,6 +842,17 @@
"node": ">=12.4.0"
}
},
+ "node_modules/@react-leaflet/core": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-3.0.0.tgz",
+ "integrity": "sha512-3EWmekh4Nz+pGcr+xjf0KNyYfC3U2JjnkWsh0zcqaexYqmmB5ZhH37kz41JXGmKzpaMZCnPofBBm64i+YrEvGQ==",
+ "license": "Hippocratic-2.1",
+ "peerDependencies": {
+ "leaflet": "^1.9.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0"
+ }
+ },
"node_modules/@rtsao/scc": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
@@ -3863,6 +3876,12 @@
"node": ">=0.10"
}
},
+ "node_modules/leaflet": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz",
+ "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==",
+ "license": "BSD-2-Clause"
+ },
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -4693,6 +4712,20 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/react-leaflet": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-5.0.0.tgz",
+ "integrity": "sha512-CWbTpr5vcHw5bt9i4zSlPEVQdTVcML390TjeDG0cK59z1ylexpqC6M1PJFjV8jD7CF+ACBFsLIDs6DRMoLEofw==",
+ "license": "Hippocratic-2.1",
+ "dependencies": {
+ "@react-leaflet/core": "^3.0.0"
+ },
+ "peerDependencies": {
+ "leaflet": "^1.9.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0"
+ }
+ },
"node_modules/reflect.getprototypeof": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
diff --git a/package.json b/package.json
index 3e113a3..f10a18a 100644
--- a/package.json
+++ b/package.json
@@ -9,19 +9,21 @@
"lint": "next lint"
},
"dependencies": {
+ "leaflet": "^1.9.4",
+ "next": "15.2.3",
"react": "^19.0.0",
"react-dom": "^19.0.0",
- "next": "15.2.3"
+ "react-leaflet": "^5.0.0"
},
"devDependencies": {
- "typescript": "^5",
+ "@eslint/eslintrc": "^3",
+ "@tailwindcss/postcss": "^4",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
- "@tailwindcss/postcss": "^4",
- "tailwindcss": "^4",
"eslint": "^9",
"eslint-config-next": "15.2.3",
- "@eslint/eslintrc": "^3"
+ "tailwindcss": "^4",
+ "typescript": "^5"
}
}
diff --git a/pages/index.js b/pages/index.js
new file mode 100644
index 0000000..6d286a8
--- /dev/null
+++ b/pages/index.js
@@ -0,0 +1,15 @@
+import Head from 'next/head';
+import Map from '../components/Map';
+
+export default function Home() {
+ return (
+
+
+
QGIS Map Example
+
+
+
+
+
+ );
+}
\ No newline at end of file