نمایک، نیاز اول کسب و کارها
پرش به محتوای اصلی

جست‌وجو و پیشنهاد خودکار

پیشنهاد خودکار هنگام تایپ و جست‌وجوی کامل مکان‌ها، با یکدست‌سازی فارسی، محدوده، کشور و نوع نتیجه.

در این صفحه

پیشنهاد خودکار یا جست‌وجو

  • GET /v1/autocomplete برای هنگام تایپ: سریع، از کش، حداکثر ۱۰ نتیجه. سرویس maps.autocomplete.
  • GET /v1/search برای وقتی کاربر Enter را زد: دو موتور با هم جست‌وجو و نتیجه‌ها ادغام می‌شوند، تا ۲۰ نتیجه. سرویس maps.search.

هر دو دسترسی maps:search می‌خواهند و هر پاسخ موفق یک واحد دارد (حتی بی نتیجه). پرسشی که پس از یکدست‌سازی از حداقل نویسه کوتاه‌تر است بی‌هزینه و بی تماس با موتور پاسخ خالی می‌گیرد.

curl -sS "https://maps.namayek.com/v1/autocomplete?q=%D9%88%D9%86%DA%A9&lat=35.757&lng=51.41&limit=5" \  -H "X-Namayek-Key: $NAMAYEK_SECRET_KEY"

پارامترها

پارامترهای autocomplete و search
پارامترنوعلزومپیش‌فرضتوضیح
qstringلازم—متن جست‌وجو تا ۲۰۰ نویسه. اگر پس از یکدست‌سازی از حداقل پروژه کوتاه‌تر باشد، پاسخ خالی و بی‌هزینه است.
latnumberهمراه lngمرکز محدوده پروژهعرض نقطه‌ای که نتیجه‌های نزدیک آن جلوتر می‌آیند؛ بین ‎-90‎ و ۹۰.
lngnumberهمراه latمرکز محدوده پروژهطول همان نقطه؛ بین ‎-180‎ و ۱۸۰.
limitintegerاختیاریتنظیم پروژه (۸)تعداد نتیجه؛ autocomplete از ۱ تا ۱۰، search از ۱ تا سقف (۲۰).
langfa | en | fa-enاختیاریزبان پیش‌فرض پروژهزبان متن نتیجه‌ها؛ fa-en برای متن همان fa است.
bboxw,s,e,nاختیاریمحدوده پروژهنتیجه‌ها را به این مستطیل محدود می‌کند (w<e و s<n).
countriescsvاختیاریتنظیم پروژهir یا فهرست کد دوحرفی کشورها، حداکثر ۲۰ کد.
typescsvاختیاریهمهزیرمجموعه‌ای از poi، street، address، place، region، country.
keystringیا سرآیند—فقط کلید عمومی nmk_pk_ در نشانی؛ روی سرور کلید را در سرآیند X-Namayek-Key بفرستید.

هر پارامتر فقط یک بار می‌آید (تکرار ⇒ INVALID_PARAM) و پارامتر ناشناخته نادیده گرفته می‌شود. عددها بی توان، بی رقم فارسی و حداکثر ۱۰ رقم اعشار.

پاسخ

پاسخ ۲۰۰
{  "available": true,  "degraded": false,  "query": "میدان آزادی",  "items": [    {      "id": "osm:R123",      "title": "میدان آزادی",      "subtitle": "میدان",      "address": "تهران، منطقه 9",      "lat": 35.699722,      "lng": 51.338056,      "type": "place",      "category": null,      "kind": "place:square",      "distance": 1250.4,      "bbox": [51.33, 35.69, 51.35, 35.71],      "source": "photon"    }  ],  "attribution": "© مشارکت کنندگان OpenStreetMap"}
فیلدهای پاسخ
فیلدنوع / مقدارتوضیح
availabletrueدر پاسخ موفق همیشه true است؛ خطای ۵۰۳ available:false و items خالی دارد.
degradedbooleantrue یعنی موتور پشتیبان پاسخ داد (کیفیت ممکن است کمتر باشد).
querystringمتن یکدست‌شده‌ای که جست‌وجو شد.
itemsSearchItem[]نتیجه‌ها به ترتیب مرتبط بودن.
attributionstringمتن انتساب داده که باید کنار نتیجه‌ها نشان دهید.
فیلدهای هر نتیجه
فیلدنوع / مقدارتوضیح
idstringشناسه پایدار؛ osm: با N/W/R و شماره، یا @lat,lng برای نتیجه بی شناسه.
titlestringعنوان نتیجه، حداکثر ۱۲۰ نویسه.
subtitlestring | nullدسته فارسی مکان («بیمارستان») یا نوع خیابان («خیابان»).
addressstringنشانی خوانا با جداکننده «، »؛ ممکن است خالی باشد.
lat / lngnumberمختصات با ۶ رقم اعشار.
typepoi | street | address | place | region | countryنوع نتیجه.
categoryPoiCategory | nullیکی از ۱۲ دسته مکان، فقط برای poi.
kindstring | nullبرچسب منبع به شکل key:value (مثلا amenity:hospital).
distancenumber | nullفاصله به متر از lat,lng درخواست، اگر داده شده باشد.
bbox[w, s, e, n] | nullمحدوده مکان‌های بزرگ (شهر، استان).
sourcephoton | nominatimموتوری که نتیجه را یافت.

یکدست‌سازی فارسی

سرور پیش از جست‌وجو متن را یکدست می‌کند، پس لازم نیست شما این کار را بکنید:

  • ی و ک عربی به فارسی، ة و ۀ به ه، أ و إ و ٱ به ا؛ حروف چسبیده متن کپی‌شده از PDF به حروف عادی.
  • اعراب و کشیده حذف و رقم‌های فارسی و عربی لاتین می‌شوند.
  • نیم‌فاصله فاصله می‌شود و نویسه‌های کنترلی و جهت‌دهی حذف می‌شوند.
  • کوتاه‌نوشت‌ها باز می‌شوند: «خ.» خیابان، «ک.» کوچه، «م.» میدان.

تاخیر و لغو

حدود ۲۵۰ میلی‌ثانیه پس از آخرین نویسه درخواست بفرستید و درخواست قبلی را لغو کنید؛ هم سریع‌تر است و هم واحد کمتری مصرف می‌کند. SearchControl همه این‌ها را آماده دارد.

تاخیر و لغو
let controller;let timer;input.addEventListener("input", () => {  clearTimeout(timer);  timer = setTimeout(async () => {    controller?.abort();                 // لغو درخواست قبلی    controller = new AbortController();    try {      const res = await NamayekMaps.autocomplete(input.value, {        key: "nmk_pk_YOUR_PUBLISHABLE_KEY",        near: map.getCenter(),        limit: 6,        signal: controller.signal,      });      render(res.items);                 // با textContent، نه innerHTML    } catch (e) {      if (e.name !== "AbortError") showError(e.message);    }  }, 250);});

سرویس در دسترس نیست

اگر موتور جست‌وجو موقتا در دسترس نباشد، پاسخ ۵۰۳ با UPSTREAM_UNAVAILABLE و Retry-After: 30 می‌آید و بدنه آن available: false و items: [] هم دارد تا رابط ساده شما نشکند. در این حالت پیام «جست‌وجو در حال آماده‌سازی است» نشان دهید؛ هزینه‌ای ثبت نمی‌شود.

آخرین به‌روزرسانی: