«جستجوی نوشتار» (جدید) اطلاعاتی درباره مجموعهای از مکانها براساس رشتهای (برای مثال، «پیتزا در نیویورک» یا «کفشفروشیهای نزدیک اتاوا» یا «خیابان اصلی ۱۲۳») برمیگرداند. سرویس با فهرستی از مکانهای منطبق با رشته نوشتاری و هرگونه سوگیری مکانی که تنظیم شده است پاسخ میدهد.
علاوهبر پارامترهای الزامی، «جستجوی نوشتار» (جدید) از پالایش پُرسمانها بااستفاده از پارامترهای اختیاری برای نتایج بهتر پشتیبانی میکند.
دریافت فهرست مکانها با جستجوی نوشتاری
با فراخوانی GMSPlacesClient
searchByTextWithRequest:،
ارسال شیء
GMSPlaceSearchByTextRequest
که پارامترهای درخواست را تعریف میکند، و روش فراخوانی از نوع
GMSPlaceSearchByTextResultCallback
برای مدیریت پاسخ، درخواست «جستجوی نوشتار» ایجاد کنید.
شیء GMSPlaceSearchByTextRequest همه پارامترهای
الزامی و اختیاری
درخواست را مشخص میکند. پارامترهای الزامی عبارتاند از:
- فهرست فیلدهایی که باید در شیء
GMSPlaceبرگردانده شوند، که به آن ماسک فیلد نیز گفته میشود، همانطور که توسطGMSPlacePropertyتعریف شده است. اگر حداقل یک فیلد را در فهرست فیلدها مشخص نکنید، یا اگر فهرست فیلدها را حذف کنید، فراخوانی خطا برمیگرداند. - پُرسمان نوشتاری.
این نمونه درخواست جستجوی نوشتار مشخص میکند که اشیای GMSPlace پاسخ
حاوی نام مکان و شناسه مکان برای هر شیء GMSPlace در نتایج
جستجو است. همچنین پاسخ را فیلتر میکند تا فقط مکانهایی از نوع «رستوران» را برگرداند.
کیت توسعه نرمافزار Places Swift
let restriction = GMSPlaceRectangularLocationOption( northEast: CLLocationCoordinate2D(latitude: 20, longitude: 30), southWest: CLLocationCoordinate2D(latitude: 40, longitude: 50) ) let searchByTextRequest = SearchByTextRequest( textQuery: "pizza in New York", placeProperties: [ .name, .placeID ], locationRestriction: restriction, includedType: .restaurant, maxResultCount: 5, minRating: 3.5, priceLevels: [ .moderate, .inexpensive ], isStrictTypeFiltering: true ) switch await placesClient.searchByText(with: searchByTextRequest) { case .success(let places): // Handle places case .failure(let placesError): // Handle error }
Swift
// Create the GMSPlaceSearchByTextRequest object. let myProperties = [GMSPlaceProperty.name, GMSPlaceProperty.placeID].map {$0.rawValue} let request = GMSPlaceSearchByTextRequest(textQuery:"pizza in New York", placeProperties:myProperties) request.isOpenNow = true request.includedType = "restaurant" request.maxResultCount = 5 request.minRating = 3.5 request.rankPreference = .distance request.isStrictTypeFiltering = true request.locationBias = GMSPlaceCircularLocationOption(CLLocationCoordinate2DMake(40.7, -74.0), 200.0) // Array to hold the places in the response var placeResults: [GMSPlace] = [] let callback: GMSPlaceSearchByTextResultCallback = { [weak self] results, error in guard let self, error == nil else { if let error { print(error.localizedDescription) } return } guard let results = results as? [GMSPlace] else { return } placeResults = results } GMSPlacesClient.shared().searchByText(with: request, callback: callback)
آبجکتیو-سی
// Create the GMSPlaceSearchByTextRequest object. GMSPlaceSearchByTextRequest *request = [[GMSPlaceSearchByTextRequest alloc] initWithTextQuery:@"pizza in New York" placeProperties:@[GMSPlacePropertyName, GMSPlacePropertyPlaceID]]; request.isOpenNow = YES; request.includedType = @"restaurant"; request.maxResultCount = 5; request.minRating = 3.5; request.rankPreference = GMSPlaceSearchByTextRankPreferenceDistance; request.isStrictTypeFiltering = YES; request.priceLevels = @[ @(kGMSPlacesPriceLevelFree), @(kGMSPlacesPriceLevelCheap) ]; request.locationBias = GMSPlaceCircularLocationOption(CLLocationCoordinate2DMake(40.7, -74.0), 200.0); // Array to hold the places in the response _placeResults = [NSArray array]; // Create the GMSPlaceSearchByTextRequest object. [_placesClient searchByTextWithRequest:request callback:^(NSArray<GMSPlace *> *_Nullable placeResults, NSError * _Nullable error) { if (error != nil) { NSLog(@"An error occurred %@", [error localizedDescription]); return; } else { if (placeResults.count > 0) { // Get list of places. _placeResults = placeResults; } } } ];
پاسخهای «جستجوی نوشتار»
Text Search API آرایهای از موارد منطبق را بهصورت اشیای GMSPlace برمیگرداند، بهطوریکه برای هر مکان منطبق یک شیء GMSPlace وجود دارد.
دریافت وضعیت باز
شیء GMSPlacesClient حاوی تابع عضوی بهنام isOpenWithRequest (isOpenRequest در Swift و isPlaceOpenRequest در GooglePlacesSwift) است که پاسخی را برمیگرداند که نشان میدهد آیا مکان درحالحاضر باز است یا نه، براساس زمان مشخصشده در فراخوانی.
این روش یک متغیر مستقل از نوع GMSPlaceIsOpenWithRequest را میگیرد که حاوی موارد زیر است:
- یک
GMSPlaceشیء، یا رشتهای که شناسه مکان را مشخص میکند. برای اطلاعات بیشتر درباره ایجاد شیء «مکان» با فیلدهای لازم، جزئیات مکان را ببینید.
- یک شیء اختیاری
NSDate(Obj-C) یاDate(Swift) که زمان موردنظر برای بررسی را مشخص میکند. اگر زمانی مشخص نشده باشد، پیشفرض «اکنون» است. - روش
GMSPlaceOpenStatusResponseCallbackبرای رسیدگی به پاسخ. >
روش GMSPlaceIsOpenWithRequest مستلزم آن است که فیلدهای زیر در شیء GMSPlace تنظیم شوند:
GMSPlacePropertyUTCOffsetMinutesGMSPlacePropertyBusinessStatusGMSPlacePropertyOpeningHoursGMSPlacePropertyCurrentOpeningHoursGMSPlacePropertySecondaryOpeningHours
اگر این فیلدها در شیء «مکان» ارائه نشده باشند، یا اگر شناسه مکان را ارسال کنید، این روش از GMSPlacesClient GMSFetchPlaceRequest: برای واکشی آنها استفاده میکند.
isOpenWithRequest پاسخ
isOpenWithRequest یک شیء GMSPlaceIsOpenResponse برمیگرداند که حاوی مقدار بولی بهنام status است که نشان میدهد کسبوکار باز است، بسته است، یا وضعیت آن نامشخص است.
| زبان | مقدار درصورت باز بودن | مقدار درصورت بسته بودن | مقدار درصورت نامشخص بودن وضعیت |
|---|---|---|---|
| Places Swift | true |
false |
nil |
| Swift | .open |
.closed |
.unknown |
| آبجکتیو-سی | GMSPlaceOpenStatusOpen |
GMSPlaceOpenStatusClosed |
GMSPlaceOpenStatusUnknown |
صدور صورتحساب برای isOpenWithRequest
- فیلدهای
GMSPlacePropertyUTCOffsetMinutesوGMSPlacePropertyBusinessStatusتحت شناسه محصول دادههای پایه هزینه دارند. بقیه «ساعات کاری» تحت «واحد نگهداری موجودی» سازمانی «جزئیات مکان» محاسبه میشود. - اگر شیء
GMSPlaceشما ازقبل این فیلدها را از درخواست قبلی داشته باشد، دوباره از شما هزینه کسر نخواهد شد.
مثال: درخواست GMSPlaceIsOpenWithRequest
مثال زیر نشان میدهد که چگونه میتوان یک GMSPlaceIsOpenWithRequest را در یک شیء GMSPlace موجود مقداردهی اولیه کرد.
کیت توسعه نرمافزار Places Swift
let isOpenRequest = IsPlaceOpenRequest(place: place) switch await placesClient.isPlaceOpen(with: isOpenRequest) { case .success(let isOpenResponse): switch isOpenResponse.status { case true: // Handle open case false: // Handle closed case nil: // Handle unknown case .failure(let placesError): // Handle error }
Swift
let isOpenRequest = GMSPlaceIsOpenRequest(place: place, date: nil) GMSPlacesClient.shared().isOpen(with: isOpenRequest) { response, error in if let error = error { // Handle Error } switch response.status { case .open: // Handle open case .closed: // Handle closed case .unknown: // Handle unknown } }
آبجکتیو-سی
GMSPlaceIsOpenRequest *isOpenRequest = [[GMSPlaceIsOpenRequest alloc] initWithPlace:place date:nil]; [[GMSPlacesClient sharedClient] isOpenWithRequest:isOpenRequest callback:^(GMSPlaceIsOpenResponse response, NSError *_Nullable error) { if (error) { // Handle error } switch (response.status) { case GMSPlaceOpenStatusOpen: // Handle open case GMSPlaceOpenStatusClosed: // Handle closed case GMSPlaceOpenStatusUnknown: // Handle unknown } }];
شمارهگذاری صفحات
«جستجوی نوشتار» یک شیء صفحهبندی، یعنی
بولی hasNextPage، ارائه میدهد که در اولین پاسخ به فراخوانی
«جستجوی نوشتار» برگردانده میشود. اگر صفحه بعدی دردسترس باشد، میتوانید از تابع fetchNextPage() برای بار کردن آن استفاده کنید.
مثال زیر نشان میدهد که چگونه میتوان بررسی کرد که آیا صفحه بعدی دردسترس است یا نه، و سپس صفحه را بار کرد.
Swift
public struct PlaceSearchPagination { public var pageSize: Int public var hasNextPage: Bool public func fetchNextPage() async -> SearchByTextResponse } public struct SearchByTextResponse { public var pagination: PlaceSearchPagination? public var places: [Place]? public var error: PlaceError? } PlacesClient.swift public func searchByText(with request: SearchByTextRequest) async -> SearchByTextResponse let searchByTextRequest = SearchByTextRequest(textQuery: "restaurants", placeProperties: [PlaceProperty.displayName], locationBias: CircularCoordinateRegion(center: CLLocationCoordinate2D(latitude: 0, longitude: 0), radius: 100)) searchByTextRequest.maxResultCount = 10 var searchByTextResponse = await PlacesClient.shared.searchByText(with: searchByTextRequest) print("Found \(searchByTextResponse.places.count) places") searchByTextResponse.pagination.pageSize = 20 // Continue making requests until no more results are found in pagination object while searchByTextResponse.pagination.hasNextPage { searchByTextResponse = await searchByTextResponse.pagination.fetchNextPage() print("Found \(searchByTextResponse.places.count) places") }
آبجکتیو-سی
GMSPlaceSearchByTextRequest *searchByTextRequest = [[GMSPlaceSearchByTextRequest alloc] initWithTextQuery: @"restaurants" placeProperties: @[GMSPlacePropertyAll]]; searchByTextRequest.maxResultCount = 10; __block void (^recursiveCallback)(GMSPlaceSearchByTextResponse *, NSError *); recursiveCallback = ^(GMSPlaceSearchByTextResponse * response, NSError* error) { NSLog(@"Found %d places", response.places.count); if (response.pagination.hasNextPage) { [response.pagination fetchNextPageWithCompletion:recursiveCallback]; } }; [GMSPlacesClient.sharedClient searchByTextWithRequest:searchByTextRequest completion:recursiveCallback];
پارامترهای الزامی
از شیء GMSPlaceSearchByTextRequest برای مشخص کردن پارامترهای لازم
برای جستجو استفاده کنید.
-
فهرست فیلدها
مشخص کنید کدام ویژگیهای دادههای مکان برگردانده شود. فهرستی از ویژگیهای
GMSPlaceرا که فیلدهای داده را برای برگرداندن مشخص میکنند ارسال کنید. اگر ماسک فیلد را حذف کنید، درخواست با خطا مواجه میشود.فهرستهای فیلد روش طراحی خوبی برای اطمینان از این است که دادههای غیرضروری درخواست نمیکنید، که به جلوگیری از زمان پردازش غیرضروری و هزینههای صورتحساب کمک میکند.
یک یا چند فیلد زیر را مشخص کنید:
فیلدهای زیر شناسه SKU فقط شناسه Text Search Essentials را راهاندازی میکنند:
GMSPlacePropertyPlaceIDبرای مشاهده فهرست کامل فیلدها و SKUهای مرتبط با آنها، به فیلدهای داده مکان (جدید) مراجعه کنید.
فیلدهای زیر شناسه کالا برای جستجوی نوشتار Pro را فعال میکنند:
GMSPlacePropertyAddressComponents
GMSPlacePropertyBusinessStatus
GMSPlacePropertyCoordinate
GMSPlacePropertyFormattedAddress
GMSPlacePropertyIconBackgroundColor
GMSPlacePropertyIconImageURL
GMSPlacePropertyName
GMSPlacePropertyPhotos
GMSPlacePropertyPlusCode
GMSPlacePropertyTypes
GMSPlacePropertyUTCOffsetMinutes
GMSPlacePropertyViewport
GMSPlacePropertyWheelchairAccessibleEntranceبرای مشاهده فهرست کامل فیلدها و SKUهای مرتبط با آنها، به فیلدهای داده مکان (جدید) مراجعه کنید.
فیلدهای زیر شناسه محصول سازمانی جستجوی نوشتار را راهاندازی میکنند:
GMSPlacePropertyCurrentOpeningHours
GMSPlacePropertySecondaryOpeningHours
GMSPlacePropertyPhoneNumber
GMSPlacePropertyPriceLevel
GMSPlacePropertyRating
GMSPlacePropertyOpeningHours
GMSPlacePropertyUserRatingsTotal
GMSPlacePropertyWebsiteبرای مشاهده فهرست کامل فیلدها و SKUهای مرتبط با آنها، به فیلدهای داده مکان (جدید) مراجعه کنید.
فیلدهای زیر شناسه محصول Text Search Enterprise Plus را فعال میکنند:
GMSPlacePropertyCurbsidePickup
GMSPlacePropertyDelivery
GMSPlacePropertyDineIn
GMSPlacePropertyEditorialSummary
GMSPlacePropertyReservable
GMSPlacePropertyReviews
GMSPlacePropertyServesBeer
GMSPlacePropertyServesBreakfast
GMSPlacePropertyServesBrunch
GMSPlacePropertyServesDinner
GMSPlacePropertyServesLunch
GMSPlacePropertyServesVegetarianFood
GMSPlacePropertyServesWine
GMSPlacePropertyTakeoutبرای مشاهده فهرست کامل فیلدها و SKUهای مرتبط با آنها، به فیلدهای داده مکان (جدید) مراجعه کنید.
-
textQuery
رشته نوشتاری که باید جستجو شود، برای مثال: «رستوران»، «خیابان اصلی ۱۲۳»، یا «بهترین مکان برای بازدید در سانفرانسیسکو».
پارامترهای اختیاری
از شیء GMSPlaceSearchByTextRequest برای مشخص کردن پارامترهای اختیاری
برای جستجو استفاده کنید.
includedType
نتایج را به مکانهایی محدود میکند که با نوع مشخصشده تعریفشده توسط جدول الف مطابقت دارند. فقط یک نوع را میتوان مشخص کرد. برای مثال:
let request = SearchByTextRequest()
request.includedType = "bar"let request = SearchByTextRequest()
request.includedType = "pharmacy"
isOpenNow
اگر
true، فقط مکانهایی را برگردانید که برای کسبوکار باز هستند در زمانی که پُرسمان ارسال میشود. اگرfalse، همه کسبوکارها را صرفنظر از وضعیت باز بودن برگردانید. اگر این پارامتر را رویfalseتنظیم کنید، مکانهایی که ساعات کاری آنها در پایگاه داده Google Places مشخص نشده است برگردانده میشوند.isStrictTypeFiltering
با پارامتر
includeTypeاستفاده میشود. وقتی رویtrueتنظیم شود، فقط مکانهایی که با انواع مشخصشده توسطincludeTypeمطابقت داشته باشند برگردانده میشوند. وقتی مقدار false (نادرست) باشد، که مقدار پیشفرض است، پاسخ میتواند حاوی مکانهایی باشد که با انواع مشخصشده مطابقت ندارند.locationBias
منطقهای را برای جستجو مشخص میکند. این مکان بهعنوان سوگیری عمل میکند، یعنی نتایج اطراف مکان مشخصشده میتواند برگردانده شود، ازجمله نتایج خارج از منطقه مشخصشده.
میتوانید
locationRestrictionیاlocationBiasرا مشخص کنید، اما نه هر دو را.locationRestrictionرا بهعنوان مشخصکننده منطقهای درنظر بگیرید که نتایج باید در آن باشد، وlocationBiasرا بهعنوان مشخصکننده منطقهای درنظر بگیرید که نتایج باید نزدیک آن باشد اما میتواند خارج از آن منطقه باشد.منطقه را بهصورت «نمای مستطیلی» یا دایره مشخص کنید.
دایره با نقطه مرکزی و شعاع به متر تعریف میشود. شعاع باید بین ۰٫۰ و ۵۰۰۰۰٫۰ باشد. شعاع پیشفرض ۰٫۰ است. برای مثال:
let request = SearchByTextRequest() request.locationBias = GMSPlaceCircularLocationOption(CLLocationCoordinate2DMake(40.7, -74.0), 200.0)
مستطیل یک نمای طول و عرض جغرافیایی است که بهصورت دو نقطه پایین و بالای مقابل هم بهصورت مورب نشان داده میشود. نقطه پایین نشاندهنده گوشه جنوب غربی مستطیل است و نقطه بالا نشاندهنده گوشه شمال شرقی مستطیل است.
ناحیه نمایش بهعنوان یک منطقه بسته درنظر گرفته میشود، یعنی مرزهای آن را شامل میشود. محدوده عرض جغرافیایی باید بین ۹۰- تا ۹۰ درجه باشد و محدوده طول جغرافیایی باید بین ۱۸۰- تا ۱۸۰ درجه باشد:
- اگر
low=high، ناحیه نمایش از آن نقطه تکی تشکیل میشود. - اگر
low.longitude>high.longitude، محدوده طول جغرافیایی معکوس میشود (نمای جغرافیایی از خط طول جغرافیایی ۱۸۰ درجه عبور میکند). - اگر
low.longitude= ۱۸۰- درجه وhigh.longitude= ۱۸۰ درجه باشد، نمای دید شامل همه طولهای جغرافیایی میشود. - اگر
low.longitude= ۱۸۰ درجه وhigh.longitude= ۱۸۰- درجه باشد، محدوده طول جغرافیایی خالی است. - اگر
low.latitude>high.latitude، محدوده عرض جغرافیایی خالی است.
- اگر
locationRestriction
منطقهای را برای جستجو مشخص میکند. نتایج خارج از منطقه مشخصشده برگردانده نمیشود. منطقه را بهعنوان «نمای مستطیلی» مشخص کنید. برای اطلاعات درباره تعریف Viewport، شرح
locationBiasرا ببینید.میتوانید
locationRestrictionیاlocationBiasرا مشخص کنید، اما نه هر دو را.locationRestrictionرا بهعنوان مشخصکننده منطقهای درنظر بگیرید که نتایج باید در آن باشد، وlocationBiasرا بهعنوان مشخصکننده منطقهای درنظر بگیرید که نتایج باید نزدیک آن باشد اما میتواند خارج از آن منطقه باشد.-
maxResultCount
حداکثر تعداد نتایج مکان را برای برگرداندن مشخص میکند. باید بین ۱ و ۲۰ (پیشفرض) باشد.
minRating
نتایج را فقط به مواردی محدود میکند که میانگین ردهبندی کاربر آنها بزرگتر یا مساوی این حد باشد. مقادیر باید بین ۰٫۰ و ۵٫۰ (شامل این دو عدد) با افزایش ۰٫۵ باشد. برای مثال: 0، 0.5، 1.0، ... ، 5.0 شامل میشود. مقادیر به نزدیکترین ۰٫۵ گرد میشوند. برای مثال، مقدار ۰٫۶ همه نتایج با ردهبندی کمتر از ۱٫۰ را حذف میکند.
-
priceLevels
جستجو را به مکانهایی محدود کنید که با سطوح قیمت خاصی علامتگذاری شدهاند. بهطور پیشفرض، همه سطوح قیمت انتخاب شده است.
آرایهای از یک یا چند مقدار تعریفشده توسط
PriceLevelرا مشخص کنید.برای مثال:
let request = SearchByTextRequest() request.priceLevels = [GMSPlacesPriceLevel.moderate.rawValue, GMSPlacesPriceLevel.cheap.rawValue]
rankPreference
مشخص میکند که نتایج در پاسخ براساس نوع پُرسمان چگونه رتبهبندی میشوند:
- برای پُرسمان دستهای مثل «رستورانهای تهران»،
.relevance(رتبهبندی نتایج براساس ارتباط جستجو) پیشفرض است. میتوانیدrankPreferenceرا روی.relevanceیا.distance(رتبهبندی نتایج براساس فاصله) تنظیم کنید. - برای پُرسمان غیردستهبندیشدهای مثل «Mountain View, CA»، توصیه میکنیم
rankPreferenceرا تنظیمنشده رها کنید.
- برای پُرسمان دستهای مثل «رستورانهای تهران»،
regionCode
کد منطقه استفادهشده برای قالببندی پاسخ، که بهعنوان مقدار کد CLDR دو نویسهای مشخص شده است. این پارامتر همچنین میتواند تأثیر سوگیرانهای بر نتایج جستجو داشته باشد. مقدار پیشفرضی وجود ندارد.
اگر نام کشور فیلد نشانی در پاسخ با کد منطقه مطابقت داشته باشد، کد کشور از نشانی حذف میشود.
اکثر کدهای CLDR با کدهای ISO 3166-1 یکسان هستند، با چند استثنای قابلتوجه. برای مثال، ccTLD پادشاهی متحد «uk» (co.uk.) است درحالیکه کد ISO 3166-1 آن «gb» است (ازنظر فنی برای نهاد «پادشاهی متحد بریتانیای کبیر و ایرلند شمالی»). این پارامتر میتواند بر نتایج براساس قانون ذیربط تأثیر بگذارد.
shouldIncludePureServiceAreaBusinesses
اگر
trueباشد، کسبوکارهای منطقه خدماتی خالص را در نتایج جستجو برمیگرداند. کسبوکار با منطقه خدماتی خالص کسبوکاری است که مستقیماً از مشتریان بازدید میکند یا به آنها کالا ارسال میکند ولی در نشانی کسبوکار به مشتریان خدماترسانی نمیکند.برای مثال:
کیت توسعه نرمافزار Places Swift
let request = SearchByTextRequest() request.shouldIncludePureServiceAreaBusinesses = true
Swift
let request = SearchByTextRequest() request.shouldIncludePureServiceAreaBusinesses: true
آبجکتیو-سی
GMSPlaceSearchByTextRequest *request = [[GMSPlaceSearchByTextRequest alloc] initWithTextQuery:@"pizza in New York" placeProperties:@[GMSPlacePropertyAll]]; request.shouldIncludePureServiceAreaBusinesses = YES;
نمایش ارجاعها در برنامه
وقتی برنامهتان اطلاعات بهدستآمده از
GMSPlacesClient
را نمایش میدهد، مثلاً عکسها و مرورها، برنامه باید ارجاعهای لازم را نیز نمایش دهد.
برای مثال، ویژگی reviews از شیء GMSPlacesClient
حاوی آرایهای از حداکثر پنج
شیء GMSPlaceReview
است. هر شیء GMSPlaceReview میتواند حاوی ارجاعها و ارجاعهای نویسنده باشد.
اگر مرور را در برنامهتان نمایش میدهید، باید هرگونه ارجاع یا ارجاع به نویسنده را نیز نمایش دهید.
برای اطلاعات بیشتر، به مستندات مربوط به اسناد مراجعه کنید.