Trang này giải thích sự khác biệt giữa các tính năng tìm địa điểm dựa trên văn bản trong
lớp Place (mới) và
PlacesService
(cũ), đồng thời cung cấp một số đoạn mã để so sánh.
PlacesService cũ có các phương thức tìm kiếm dựa trên văn bản sau:
- Phương thức
findPlaceFromQuery()sẽ nhận một truy vấn văn bản và trả về một kết quả địa điểm duy nhất, đồng thời hỗ trợ việc sử dụng các trường dữ liệu địa điểm. - Phương thức
findPlaceFromPhoneNumber()cho phép bạn tìm địa điểm bằng số điện thoại và hỗ trợ việc sử dụng các trường dữ liệu địa điểm. - Phương thức
textSearch()sẽ nhận một truy vấn văn bản và trả về danh sách kết quả địa điểm.textSearch()là phương thức cũ hơn và không hỗ trợ việc sử dụng các trường dữ liệu địa điểm.
Lớp Place mới cung cấp phương thức Place.searchByText(). Phương thức này cho phép bạn
tìm địa điểm bằng truy vấn văn bản hoặc số điện thoại, đồng thời cho phép bạn
tuỳ chỉnh lượt tìm kiếm bằng cách sử dụng nhiều trường dữ liệu địa điểm và loại địa điểm được cập nhật thường xuyên.
Bảng sau đây liệt kê một số điểm khác biệt chính trong các phương thức tìm địa điểm
giữa lớp Place và PlacesService:
PlacesService (Cũ) |
Place (Mới) |
|---|---|
findPlaceFromQuery()findPlaceFromPhoneNumber()
|
searchByText() |
FindPlaceFromQueryRequestFindPlaceFromPhoneNumberRequest |
SearchByTextRequest |
| Các lựa chọn truy vấn bị hạn chế. | Các lựa chọn truy vấn mở rộng hơn. |
Yêu cầu sử dụng lệnh gọi lại để xử lý đối tượng kết quả và
google.maps.places.PlacesServiceStatus phản hồi. |
Sử dụng Lời hứa và hoạt động không đồng bộ. |
Yêu cầu kiểm tra PlacesServiceStatus. |
Không yêu cầu kiểm tra trạng thái, có thể sử dụng tính năng xử lý lỗi tiêu chuẩn. Tìm hiểu thêm. |
| Chỉ hỗ trợ độ lệch vị trí. | Hỗ trợ độ lệch vị trí và hạn chế vị trí. |
| Các trường dữ liệu địa điểm được định dạng bằng cách sử dụng snake case. | Các trường dữ liệu địa điểm được định dạng bằng cách sử dụng camel case. |
| Trả về một kết quả địa điểm duy nhất. | Trả về tối đa 20 kết quả địa điểm. |
| Chỉ giới hạn ở một tập hợp cố định các loại địa điểm và trường dữ liệu địa điểm. | Cung cấp nhiều loại địa điểm và trường dữ liệu địa điểm được cập nhật thường xuyên. |
textSearch() |
searchByText() |
| Trả về tất cả các trường dữ liệu hiện có (một tập hợp con của các trường được hỗ trợ); không thể giới hạn ở các trường cụ thể. | Chỉ trả về các trường dữ liệu địa điểm được yêu cầu . |
So sánh mã
Phần này so sánh mã cho các phương thức tìm kiếm văn bản để minh hoạ sự khác biệt giữa Dịch vụ địa điểm và lớp Địa điểm. Các đoạn mã cho thấy mã cần thiết trên từng API tương ứng để đưa ra yêu cầu tìm kiếm dựa trên văn bản.
Dịch vụ địa điểm (Cũ)
Đoạn mã sau đây cho thấy cách sử dụng phương thức findPlaceFromQuery() để tìm địa điểm. Yêu cầu này là đồng bộ và bao gồm một lượt kiểm tra có điều kiện trên PlacesServiceStatus. Các trường dữ liệu địa điểm cần thiết được chỉ định trong nội dung yêu cầu. Nội dung này được xác định trước khi đưa ra yêu cầu thực tế.
function findPlaces() {
const request = {
query: "Museum of Contemporary Art Australia",
fields: ["name", "geometry"],
};
// Create an instance of PlacesService.
service = new google.maps.places.PlacesService(map);
// Make a findPlaceFromQuery request.
service.findPlaceFromQuery(request, (results, status) => {
let place = results[0];
if (status === google.maps.places.PlacesServiceStatus.OK && results) {
if (!place.geometry || !place.geometry.location) return;
const marker = new google.maps.Marker({
map,
position: place.geometry.location,
});
map.setCenter(place.geometry.location);
}
});
}
Tìm hiểu thêm
Tìm kiếm văn bản (Mới)
Đoạn mã sau đây cho thấy cách sử dụng phương thức searchByText() để tìm địa điểm. Yêu cầu này là không đồng bộ và không yêu cầu kiểm tra trạng thái (có thể sử dụng tính năng xử lý lỗi tiêu chuẩn). Trong ví dụ này, yêu cầu bao gồm maxResultCount là 8 (giá trị phải nằm trong khoảng từ 1 đến 20). Hàm này lặp lại các kết quả và thêm điểm đánh dấu cho từng kết quả, điều chỉnh ranh giới bản đồ dựa trên vị trí của các điểm đánh dấu. Vì phương thức searchByText() sử dụng toán tử await, nên phương thức này chỉ có thể được dùng bên trong hàm async.
async function findPlaces() {
// Define a request.
// The `fields` property is required; all others are optional.
const request = {
fields: ["displayName", "location", "businessStatus"],
textQuery: "Tacos in Mountain View",
includedType: "restaurant",
locationBias: { lat: 37.4161493, lng: -122.0812166 },
isOpenNow: true,
language: "en-US",
maxResultCount: 8,
minRating: 3.2,
region: "us",
useStrictTypeFiltering: false,
};
// Call searchByText passing the request.
const { places } = await google.maps.places.Place.searchByText(request);
// Add a marker for each result.
if (places.length) {
const bounds = new google.maps.LatLngBounds();
places.forEach((place) => {
const markerView = new google.maps.marker.AdvancedMarkerElement({
map,
position: place.location,
title: place.displayName,
});
bounds.extend(place.location);
console.log(place);
});
map.fitBounds(bounds);
} else {
console.log("No results");
}
}
Phương thức searchByText() hỗ trợ nhiều lựa chọn yêu cầu hơn so với phiên bản trước, bao gồm:
includedTypecho phép bạn giới hạn lượt tìm kiếm ở một loại địa điểm cụ thể.isOpenNowcho phép bạn giới hạn lượt tìm kiếm để chỉ trả về những địa điểm đang mở cửa.minRatingcho phép bạn lọc ra những kết quả dưới mức giới hạn đã chỉ định (ví dụ: chỉ trả về những địa điểm có 3 sao trở lên).locationRestrictionsẽ bỏ qua những kết quả bên ngoài vị trí đã chỉ định (locationBiascũng được hỗ trợ).
Tìm hiểu thêm
- Xem mã ví dụ hoàn chỉnh
- Xem tài liệu về tính năng Tìm kiếm văn bản (Mới)
- Xem tài liệu tham khảo về
searchByText()