تأخذ خدمة "البحث النصي" (جديدة) طلب بحث نصيًا وتعرض قائمة بالأماكن المطابقة.
تعرض خدمة "البحث النصي" (الجديدة) معلومات حول مجموعة من الأماكن استنادًا إلى سلسلة، مثل "بيتزا في نيويورك" أو "متاجر ��حذية بالقرب من أوتاوا" أو "123 شارع مين". تستجيب الخدمة بقائمة من الأماكن التي تطابق السلسلة النصية وأي تحيّز للموقع الجغرافي تم ضبطه. تتيح لك خدمة "البحث النصي" (جديدة) البحث عن أماكن حسب النوع، والفلتَرة باستخدام معايير مثل ساعات العمل والتقييم، وتقييد النتائج أو تحسينها لتناسب موقعًا جغرافيًا محدّدًا.
لاستخدام "البحث النصي (جديد)"، يجب تفعيل Places API (جديد) في مشروعك على Google Cloud. لمزيد من التفاصيل، يُرجى الاطّلاع على البدء.
البحث عن أماكن من خلال طلب بحث نصي
اتّصِل بالرقم searchByText
لعرض قائمة بالأماكن من طلب بحث نصي أو رقم هاتف.
حدِّد مَعلمات البحث باستخدام طلب، ثم استدعِع searchByText()
. يتم عرض النتائج كقائمة من عناصر Place
، يمكنك من خلالها الحصول على تفاصيل المكان. يوضّح المقتطف التالي مثالاً على طلب واستدعاء searchByText
:
TypeScript
const request = { textQuery: query, fields: ['displayName', 'location', 'businessStatus'], includedType: '', // Restrict query to a specific type (leave blank for any). useStrictTypeFiltering: true, locationBias: map.center, isOpenNow: true, language: 'en-US', maxResultCount: 8, minRating: 1, // Specify a minimum rating. region: 'us', }; const { places } = await Place.searchByText(request);
JavaScript
const request = { textQuery: query, fields: ['displayName', 'location', 'businessStatus'], includedType: '', // Restrict query to a specific type (leave blank for any). useStrictTypeFiltering: true, locationBias: map.center, isOpenNow: true, language: 'en-US', maxResultCount: 8, minRating: 1, // Specify a minimum rating. region: 'us', }; const { places } = await Place.searchByText(request);
- حدِّد طلب بحث نصيًا أو رقم هاتف للبحث باستخدام المَعلمة
textQuery
. - استخدِم المَعلمة
fields
(مطلوبة) لتحديد قائمة مفصولة بفواصل تضم حقل بيانات واحدًا أو أكثر من حقول البيانات بتنسيق camel case. - استخدِم المَعلمة
includedType
لعرض النتائج من النوع المحدّد فقط. - استخدِم
locationBias
أوlocationRestriction
لتفضيل أو حصر نتائج البحث النصي على منطقة معيّنة.
إذا كان طلب البحث يتضمّن رقم هاتف، يجب ضبط المَعلمة region. على سبيل المثال، إذا كنت تستخدم رقم هاتف للبحث عن مكان في اليابان، وكان النطاق الذي يرسل الطلب هو jp
، عليك ضبط المَعلمة region
على "jp". في حال حذف region
من الطلب، ستستخدم واجهة برمجة التطبيقات تلقائيًا المنطقة الجغرافية "الولايات المتحدة" (us).
Place
، يمكنك من خلالها الحصول على تفاصيل المكان.
مثال
يستدعي المثال التالي searchByText
باستخدام نص طلب البحث المقدَّم، ثم يملأ خريطة بعلامات قابلة للنقر لعرض النتائج.
TypeScript
let map; let markers = {}; let infoWindow; async function initMap() { const { Map, InfoWindow } = await google.maps.importLibrary("maps") as google.maps.MapsLibrary; const center = { lat: 37.4161493, lng: -122.0812166 }; map = new Map(document.getElementById('map') as HTMLElement, { center: center, zoom: 11, mapTypeControl: false, mapId: 'DEMO_MAP_ID', }); const textInput = document.getElementById('text-input') as HTMLInputElement; const textInputButton = document.getElementById('text-input-button') as HTMLButtonElement; const card = document.getElementById('text-input-card') as HTMLElement; map.controls[google.maps.ControlPosition.TOP_LEFT].push(card); textInputButton.addEventListener('click', () => { findPlaces(textInput.value); }); textInput.addEventListener('keydown', (event) => { if (event.key === 'Enter') { findPlaces(textInput.value); } }); infoWindow = new google.maps.InfoWindow(); } async function findPlaces(query) { const { Place } = await google.maps.importLibrary("places") as google.maps.PlacesLibrary; const { AdvancedMarkerElement } = await google.maps.importLibrary("marker") as google.maps.MarkerLibrary; const request = { textQuery: query, fields: ['displayName', 'location', 'businessStatus'], includedType: '', // Restrict query to a specific type (leave blank for any). useStrictTypeFiltering: true, locationBias: map.center, isOpenNow: true, language: 'en-US', maxResultCount: 8, minRating: 1, // Specify a minimum rating. region: 'us', }; const { places } = await Place.searchByText(request); if (places.length) { const { LatLngBounds } = await google.maps.importLibrary("core") as google.maps.CoreLibrary; const bounds = new LatLngBounds(); // First remove all existing markers. for (const id in markers) { markers[id].map = null; }; markers = {}; // Loop through and get all the results. places.forEach(place => { const marker = new AdvancedMarkerElement({ map, position: place.location, title: place.displayName, }); markers[place.id] = marker; marker.addListener('gmp-click', () => { map.panTo(place.location); updateInfoWindow(place.displayName, place.id, marker); }); if (place.location != null) { bounds.extend(place.location); } }); map.fitBounds(bounds); } else { console.log('No results'); } } // Helper function to create an info window. async function updateInfoWindow(title, content, anchor) { infoWindow.setContent(content); infoWindow.setHeaderContent(title); infoWindow.open({ map, anchor, shouldFocus: false, }); } initMap();
JavaScript
let map; let markers = {}; let infoWindow; async function initMap() { const { Map, InfoWindow } = await google.maps.importLibrary("maps"); const center = { lat: 37.4161493, lng: -122.0812166 }; map = new Map(document.getElementById('map'), { center: center, zoom: 11, mapTypeControl: false, mapId: 'DEMO_MAP_ID', }); const textInput = document.getElementById('text-input'); const textInputButton = document.getElementById('text-input-button'); const card = document.getElementById('text-input-card'); map.controls[google.maps.ControlPosition.TOP_LEFT].push(card); textInputButton.addEventListener('click', () => { findPlaces(textInput.value); }); textInput.addEventListener('keydown', (event) => { if (event.key === 'Enter') { findPlaces(textInput.value); } }); infoWindow = new google.maps.InfoWindow(); } async function findPlaces(query) { const { Place } = await google.maps.importLibrary("places"); const { AdvancedMarkerElement } = await google.maps.importLibrary("marker"); const request = { textQuery: query, fields: ['displayName', 'location', 'businessStatus'], includedType: '', // Restrict query to a specific type (leave blank for any). useStrictTypeFiltering: true, locationBias: map.center, isOpenNow: true, language: 'en-US', maxResultCount: 8, minRating: 1, // Specify a minimum rating. region: 'us', }; const { places } = await Place.searchByText(request); if (places.length) { const { LatLngBounds } = await google.maps.importLibrary("core"); const bounds = new LatLngBounds(); // First remove all existing markers. for (const id in markers) { markers[id].map = null; } ; markers = {}; // Loop through and get all the results. places.forEach(place => { const marker = new AdvancedMarkerElement({ map, position: place.location, title: place.displayName, }); markers[place.id] = marker; marker.addListener('gmp-click', () => { map.panTo(place.location); updateInfoWindow(place.displayName, place.id, marker); }); if (place.location != null) { bounds.extend(place.location); } }); map.fitBounds(bounds); } else { console.log('No results'); } } // Helper function to create an info window. async function updateInfoWindow(title, content, anchor) { infoWindow.setContent(content); infoWindow.setHeaderContent(title); infoWindow.open({ map, anchor, shouldFocus: false, }); } initMap();
CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ #map { height: 100%; } /* * Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; } #text-input-card { width: 25%; background-color: #fff; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px; margin: 10px; padding: 5px; font-family: Roboto, sans-serif; font-size: large; font-weight: bold; } #text-input { width: 100%; padding: 10px; margin: 0; box-sizing: border-box; } #text-input-button { display: inline-block; margin-top: .5rem; width: auto; padding: .6rem .75rem; font-size: .875rem; font-weight: 500; color: #fff; background-color: #2563eb; border: none; border-radius: .375rem; cursor: pointer; transition: background-color .15s ease-in-out; text-align: center }
HTML
<html> <head> <title>Text Search</title> <link rel="stylesheet" type="text/css" href="./style.css" /> <script type="module" src="./index.js"></script> </head> <body> <div id="text-input-card"> <input type="text" id="text-input" placeholder="Search for a place"></input> <input type="button" id="text-input-button" value="Search"></input> </div> <div id="map"></div> <!-- prettier-ignore --> <script>(g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))}) ({key: "AIzaSyA6myHzS10YXdcazAFalmXvDkrYCp5cLc8", v: "weekly"});</script> </body> </html>