راهنمای استفاده از سرویس نقشه میمپس
یاد بگیرید چگونه از سرویس نقشه میمپس در پروژههای خود استفاده کنید - API نقشه رستری ایرانی
معرفی سرویس میمپس
سرویس نقشه میمپس یک سرویس رایگان برای ارائه نقشههای رستری با کیفیت بالا است
ویژگیهای کلیدی
رایگان و بدون محدودیت
استفاده کاملاً رایگان بدون نیاز به ثبتنام یا کلید API
کیفیت بالا
نقشههای با کیفیت بالا و جزئیات دقیق
سازگاری کامل
سازگار با تمام کتابخانههای نقشه موجود
سرعت بالا
بهینهسازی شده برای سرعت بارگذاری بالا
استفاده با Leaflet
نحوه استفاده از سرویس میمپس با کتابخانه Leaflet
کد کامل HTML
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
</head>
<body>
<div id="map" style="height: 400px;"></div>
<script>
var map = L.map('map').setView([32.4279, 53.6880], 6);
L.tileLayer('https://memaps.ir/hot/{z}/{x}/{y}.png', {
attribution: '© میمپس',
maxZoom: 18
}).addTo(map);
</script>
</body>
</html>
تنظیمات پیشرفته
// تنظیمات پیشرفته
L.tileLayer('https://memaps.ir/hot/{z}/{x}/{y}.png', {
attribution: '© میمپس',
maxZoom: 18,
minZoom: 1,
tileSize: 256,
zoomOffset: 0,
detectRetina: true
}).addTo(map);
// برای صفحهنمایشهای رتینا (تشخیص خودکار)
L.tileLayer('https://memaps.ir/hot/{z}/{x}/{y}@2x.png', {
attribution: '© میمپس',
maxZoom: 18,
detectRetina: true
}).addTo(map);
// اضافه کردن مارکر
L.marker([35.6892, 51.3890])
.bindPopup('تهران')
.addTo(map);
صفحهنمایش رتینا
بهینهسازی برای صفحهنمایشهای با تراکم پیکسل بالا
روش اول: استفاده از ret
با استفاده از ret به جای hot، کاشیهای 512 پیکسلی دریافت میکنید که برای صفحهنمایشهای رتینا بهینه هستند.
// برای صفحهنمایشهای رتینا
L.tileLayer('https://memaps.ir/ret/{z}/{x}/{y}.png', {
attribution: '© میمپس',
maxZoom: 18,
tileSize: 512,
zoomOffset: -1
}).addTo(map);
روش دوم: تشخیص خودکار با @2x
سرویس میمپس به صورت هوشمند تشخیص میدهد و در صورت نیاز تایلهای 512 پیکسلی ارسال میکند.
// تشخیص خودکار رتینا
L.tileLayer('https://memaps.ir/hot/{z}/{x}/{y}@2x.png', {
attribution: '© میمپس',
maxZoom: 18,
detectRetina: true
}).addTo(map);
مقایسه کیفیت
| نوع | اندازه تایل | کیفیت | کاربرد |
|---|---|---|---|
hot |
256px | استاندارد | عمومی |
ret |
512px | عالی | رتینا |
hot@2x |
512px | عالی | تشخیص خودکار |
مثالهای عملی
// OpenLayers با تشخیص خودکار
var layer = new ol.layer.Tile({
source: new ol.source.XYZ({
url: 'https://memaps.ir/hot/{z}/{x}/{y}@2x.png',
crossOrigin: 'anonymous'
})
});
// Mapbox GL JS
map.addSource('memaps', {
type: 'raster',
tiles: ['https://memaps.ir/hot/{z}/{x}/{y}@2x.png'],
tileSize: 256
});
نکات مهم:
روش ret:
- ✅ tileSize: 512 - اندازه تایل را 512 پیکسل تنظیم کنید
- ✅ zoomOffset: -1 - سطح زوم را یک واحد کاهش دهید
- ✅ maxZoom: 18 - حداکثر سطح زوم
روش @2x:
- ✅ detectRetina: true - تشخیص خودکار رتینا
- ✅ بدون تنظیمات اضافی - سرویس خودکار تشخیص میدهد
- ✅ سازگاری بهتر - با تمام کتابخانهها
حالت تاریک (Dark Mode)
لایههای تاریک برای محیطهای کمنور با دو کیفیت استاندارد و رتینا
Leaflet – استفاده از لایههای تاریک
// ایجاد نقشه
const map = L.map('map').setView([32.4279, 53.6880], 6);
// لایههای روشن
const hot = L.tileLayer('https://memaps.ir/hot/{z}/{x}/{y}.png', {
maxZoom: 18
});
const ret = L.tileLayer('https://memaps.ir/ret/{z}/{x}/{y}.png', {
maxZoom: 18,
tileSize: 512,
zoomOffset: -1
});
// لایههای تاریک
const dark = L.tileLayer('https://memaps.ir/dark/{z}/{x}/{y}.png', {
maxZoom: 18
});
const darkRetina = L.tileLayer('https://memaps.ir/dark-retina/{z}/{x}/{y}.png', {
maxZoom: 18,
tileSize: 512,
zoomOffset: -1
});
// لایه پیشفرض
hot.addTo(map);
// کنترل سوییچ لایهها
L.control.layers(
{
'روشن (استاندارد)': hot,
'روشن (رتینا)': ret,
'تاریک (استاندارد)': dark,
'تاریک (رتینا)': darkRetina
},
null,
{ collapsed: false }
).addTo(map);
OpenLayers – استفاده از لایه تاریک
// لایه تاریک استاندارد
const darkLayer = new ol.layer.Tile({
source: new ol.source.XYZ({
url: 'https://memaps.ir/dark/{z}/{x}/{y}.png',
crossOrigin: 'anonymous'
})
});
// لایه تاریک رتینا
const darkRetinaLayer = new ol.layer.Tile({
source: new ol.source.XYZ({
url: 'https://memaps.ir/dark-retina/{z}/{x}/{y}.png',
crossOrigin: 'anonymous',
tileGrid: ol.tilegrid.createXYZ({
maxZoom: 18,
tileSize: 512
})
})
});
const map = new ol.Map({
target: 'map',
layers: [darkLayer], // یا darkRetinaLayer
view: new ol.View({
center: ol.proj.fromLonLat([53.6880, 32.4279]),
zoom: 6
})
});
URLهای حالت تاریک
https://memaps.ir/dark/{z}/{x}/{y}.png
https://memaps.ir/dark-retina/{z}/{x}/{y}.png
استفاده با OpenLayers
نحوه استفاده از سرویس میمپس با کتابخانه OpenLayers
کد کامل HTML
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/ol@v7.4.0/ol.css">
<script src="https://cdn.jsdelivr.net/npm/ol@v7.4.0/dist/ol.js"></script>
</head>
<body>
<div id="map" style="height: 400px;"></div>
<script>
var layer = new ol.layer.Tile({
source: new ol.source.XYZ({
url: 'https://memaps.ir/hot/{z}/{x}/{y}.png'
})
});
var map = new ol.Map({
target: 'map',
layers: [layer],
view: new ol.View({
center: ol.proj.fromLonLat([53.6880, 32.4279]),
zoom: 6
})
});
</script>
</body>
</html>
تنظیمات پیشرفته
// تنظیمات پیشرفته
var layer = new ol.layer.Tile({
source: new ol.source.XYZ({
url: 'https://memaps.ir/hot/{z}/{x}/{y}.png',
crossOrigin: 'anonymous',
tileGrid: ol.tilegrid.createXYZ({
maxZoom: 18,
minZoom: 1
})
})
});
// برای صفحهنمایشهای رتینا
var retinaLayer = new ol.layer.Tile({
source: new ol.source.XYZ({
url: 'https://memaps.ir/ret/{z}/{x}/{y}.png',
crossOrigin: 'anonymous',
tileGrid: ol.tilegrid.createXYZ({
maxZoom: 18,
minZoom: 1,
tileSize: 512
})
})
});
// تشخیص خودکار رتینا
var autoRetinaLayer = new ol.layer.Tile({
source: new ol.source.XYZ({
url: 'https://memaps.ir/hot/{z}/{x}/{y}@2x.png',
crossOrigin: 'anonymous',
tileGrid: ol.tilegrid.createXYZ({
maxZoom: 18,
minZoom: 1
})
})
});
// اضافه کردن کنترلها
var map = new ol.Map({
target: 'map',
layers: [layer],
controls: ol.control.defaults().extend([
new ol.control.FullScreen(),
new ol.control.ScaleLine()
]),
view: new ol.View({
center: ol.proj.fromLonLat([53.6880, 32.4279]),
zoom: 6,
maxZoom: 18,
minZoom: 1
})
});
توسعه موبایل
نحوه استفاده از سرویس میمپس در اپلیکیشنهای اندروید و iOS
📱 اندروید (Android)
استفاده با MapView
// در layout XML
<com.google.android.gms.maps.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
// در Activity
MapView mapView = findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(googleMap -> {
// تنظیم نوع نقشه به None
googleMap.setMapType(GoogleMap.MAP_TYPE_NONE);
// اضافه کردن TileOverlay
TileProvider tileProvider = new UrlTileProvider(256, 256) {
@Override
public URL getTileUrl(int x, int y, int zoom) {
String url = String.format(
"https://memaps.ir/hot/%d/%d/%d.png",
zoom, x, y
);
try {
return new URL(url);
} catch (MalformedURLException e) {
return null;
}
}
};
googleMap.addTileOverlay(new TileOverlayOptions()
.tileProvider(tileProvider));
});
حالت تاریک
// تغییر URL به لایه تاریک (استاندارد)
String url = String.format(
"https://memaps.ir/dark/%d/%d/%d.png",
zoom, x, y
);
// برای رتینا تاریک (512px)
String url = String.format(
"https://memaps.ir/dark-retina/%d/%d/%d.png",
zoom, x, y
);
استفاده با WebView
// در layout XML
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
// در Activity
WebView webView = findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
String html = "<!DOCTYPE html>" +
"<html><head>" +
"<link rel='stylesheet' href='https://unpkg.com/leaflet@1.9.4/dist/leaflet.css' />" +
"<script src='https://unpkg.com/leaflet@1.9.4/dist/leaflet.js'></script>" +
"</head><body>" +
"<div id='map' style='height: 100vh;'></div>" +
"<script>" +
"var map = L.map('map').setView([32.4279, 53.6880], 6);" +
"L.tileLayer('https://memaps.ir/hot/{z}/{x}/{y}.png', {" +
"attribution: '© میمپس'" +
"}).addTo(map);" +
"</script></body></html>";
webView.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null);
// حالت تاریک با WebView
String htmlDark = "<!DOCTYPE html>" +
"<html><head>" +
"<link rel='stylesheet' href='https://unpkg.com/leaflet@1.9.4/dist/leaflet.css' />" +
"<script src='https://unpkg.com/leaflet@1.9.4/dist/leaflet.js'></script>" +
"</head><body>" +
"<div id='map' style='height: 100vh;'></div>" +
"<script>" +
"var map = L.map('map').setView([32.4279, 53.6880], 6);" +
"L.tileLayer('https://memaps.ir/dark/{z}/{x}/{y}.png', {" +
"attribution: '© میمپس'" +
"}).addTo(map);" +
"</script></body></html>";
webView.loadDataWithBaseURL(null, htmlDark, "text/html", "UTF-8", null);
🍎 iOS
استفاده با MapKit
import MapKit
class MapViewController: UIViewController {
@IBOutlet weak var mapView: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
// تنظیم مرکز نقشه
let center = CLLocationCoordinate2D(
latitude: 32.4279,
longitude: 53.6880
)
let region = MKCoordinateRegion(
center: center,
span: MKCoordinateSpan(
latitudeDelta: 10,
longitudeDelta: 10
)
)
mapView.setRegion(region, animated: false)
// اضافه کردن TileOverlay
let tileOverlay = CustomTileOverlay()
mapView.addOverlay(tileOverlay, level: .aboveLabels)
}
}
class CustomTileOverlay: MKTileOverlay {
override init(urlTemplate: String?) {
// حالت تاریک استاندارد
super.init(urlTemplate: "https://memaps.ir/dark/{z}/{x}/{y}.png")
}
}
// حالت تاریک رتینا
class CustomTileOverlayRetina: MKTileOverlay {
override init(urlTemplate: String?) {
super.init(urlTemplate: "https://memaps.ir/dark-retina/{z}/{x}/{y}.png")
}
}
استفاده با WKWebView
import WebKit
class WebMapViewController: UIViewController {
@IBOutlet weak var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let html = """
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
</head>
<body>
<div id="map" style="height: 100vh;"></div>
<script>
var map = L.map('map').setView([32.4279, 53.6880], 6);
L.tileLayer('https://memaps.ir/hot/{z}/{x}/{y}.png', {
attribution: '© میمپس'
}).addTo(map);
</script>
</body>
</html>
"""
webView.loadHTMLString(html, baseURL: nil)
}
}
🦋 فلاتر (Flutter)
استفاده با flutter_map
// pubspec.yaml
dependencies:
flutter_map: ^6.1.0
latlong2: ^0.9.0
// در widget
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong.dart';
class MapScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('نقشه میمپس')),
body: FlutterMap(
options: MapOptions(
center: LatLng(32.4279, 53.6880),
zoom: 6.0,
),
children: [
TileLayer(
urlTemplate: 'https://memaps.ir/dark/{z}/{x}/{y}.png',
userAgentPackageName: 'com.example.app',
attribution: '© میمپس',
),
],
),
);
}
}
استفاده با WebView
// pubspec.yaml
dependencies:
webview_flutter: ^4.4.2
// در widget
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
class WebMapScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final html = '''
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
</head>
<body>
<div id="map" style="height: 100vh;"></div>
<script>
var map = L.map('map').setView([32.4279, 53.6880], 6);
L.tileLayer('https://memaps.ir/dark/{z}/{x}/{y}.png', {
attribution: '© میمپس'
}).addTo(map);
</script>
</body>
</html>
''';
return Scaffold(
appBar: AppBar(title: Text('نقشه وب')),
body: WebView(
initialData: WebViewData(
data: html,
mimeType: 'text/html',
encoding: 'utf-8',
),
javascriptMode: JavascriptMode.unrestricted,
),
);
}
}
⚛️ React Native
استفاده با react-native-maps
// package.json
npm install react-native-maps
// در component
import React from 'react';
import { View, StyleSheet } from 'react-native';
import MapView, { UrlTile } from 'react-native-maps';
const MapScreen = () => {
return (
<View style={styles.container}>
<MapView
style={styles.map}
initialRegion={{{
latitude: 32.4279,
longitude: 53.6880,
latitudeDelta: 10,
longitudeDelta: 10,
}}}
mapType="none"
>
<UrlTile
urlTemplate="https://memaps.ir/dark/{z}/{x}/{y}.png"
/>
</MapView>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
map: {
flex: 1,
},
});
export default MapScreen;
استفاده با WebView
// package.json
npm install react-native-webview
// در component
import React from 'react';
import { View, StyleSheet } from 'react-native';
import { WebView } from 'react-native-webview';
const WebMapScreen = () => {
const html = `
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
</head>
<body>
<div id="map" style="height: 100vh;"></div>
<script>
var map = L.map('map').setView([32.4279, 53.6880], 6);
L.tileLayer('https://memaps.ir/dark/{z}/{x}/{y}.png', {
attribution: '© میمپس'
}).addTo(map);
</script>
</body>
</html>
`;
return (
<View style={styles.container}>
<WebView
source={{{ html }}}
style={styles.webview}
javaScriptEnabled={true}
/>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
webview: {
flex: 1,
},
});
export default WebMapScreen;
💚 Vue.js
استفاده با Leaflet
// package.json
npm install leaflet vue-leaflet
// در component
<template>
<div id="map" style="height: 400px;"></div>
</template>
<script>
import L from 'leaflet';
import 'leaflet/dist/leaflet.css';
export default {
name: 'MapComponent',
mounted() {
// ایجاد نقشه
this.map = L.map('map').setView([32.4279, 53.6880], 6);
// اضافه کردن لایه نقشه
L.tileLayer('https://memaps.ir/dark/{z}/{x}/{y}.png', {
attribution: '© میمپس',
maxZoom: 18,
}).addTo(this.map);
},
beforeUnmount() {
if (this.map) {
this.map.remove();
}
},
};
</script>
<style scoped>
#map {
width: 100%;
border-radius: 8px;
}
</style>
استفاده با OpenLayers
// package.json
npm install ol
// در component
<template>
<div id="map" style="height: 400px;"></div>
</template>
<script>
import Map from 'ol/Map';
import View from 'ol/View';
import TileLayer from 'ol/layer/Tile';
import XYZ from 'ol/source/XYZ';
import { fromLonLat } from 'ol/proj';
import 'ol/ol.css';
export default {
name: 'OpenLayersMap',
mounted() {
// ایجاد نقشه
this.map = new Map({
target: 'map',
layers: [
new TileLayer({
source: new XYZ({
url: 'https://memaps.ir/dark/{z}/{x}/{y}.png',
attributions: '© میمپس',
}),
}),
],
view: new View({
center: fromLonLat([53.6880, 32.4279]),
zoom: 6,
maxZoom: 18,
}),
});
},
beforeUnmount() {
if (this.map) {
this.map.setTarget(undefined);
}
},
};
</script>
<style scoped>
#map {
width: 100%;
border-radius: 8px;
}
</style>
نکات مهم برای توسعه موبایل و وب:
- ✅ اندروید: نیاز به Google Play Services
- ✅ iOS: نیاز به MapKit framework
- ✅ فلاتر: استفاده از flutter_map یا WebView
- ✅ React Native: react-native-maps یا WebView
- ✅ Vue.js: Leaflet یا OpenLayers
- ✅ WebView: سادهترین روش برای موبایل
- ✅ کش: برای بهبود عملکرد از کش محلی استفاده کنید
- ✅ اینترنت: بررسی اتصال اینترنت قبل از بارگذاری
- ✅ خطا: مدیریت خطاهای شبکه
- ✅ حافظه: مدیریت حافظه برای نقشههای بزرگ
- ✅ بهینهسازی: تنظیم سطح زوم مناسب
- ✅ Responsive: طراحی واکنشگرا برای همه سایزها
مرجع API
اطلاعات کامل درباره API سرویس میمپس
URL Templates
https://memaps.ir/hot/{z}/{x}/{y}.png
https://memaps.ir/ret/{z}/{x}/{y}.png
https://memaps.ir/hot/{z}/{x}/{y}@2x.png
https://memaps.ir/dark/{z}/{x}/{y}.png
https://memaps.ir/dark-retina/{z}/{x}/{y}.png
پارامترها
| پارامتر | توضیح | محدوده |
|---|---|---|
{z} |
سطح زوم | 1 تا 20 |
{x} |
مختصات X تایل | 0 تا 2^z-1 |
{y} |
مختصات Y تایل | 0 تا 2^z-1 |
قابلیتها
- ✅ استفاده رایگان و بدون محدودیت
- ✅ بدون نیاز به کلید API
- ✅ پشتیبانی از CORS
- ✅ بهینهسازی شده برای سرعت بالا
- ✅ تشخیص خودکار صفحهنمایشهای رتینا
- ✅ پشتیبانی از تایلهای 512 پیکسلی
سوالات متداول
پاسخ سوالات رایج درباره سرویس میمپس