曾经想在您的网站或应用程序中添加 Geo-Search 等高级功能,但是该过程感觉太压倒了?
好吧,我会让您进入商业秘密! ðÖ«
可以使用只使用9行代码</strong>使用 firestore 来完成! ðÖ
让我们开始!
将Geo-Hash添加到您的数据中
在使用地理搜索之前,您需要在称为geohash
的数据中添加一个其他字段。
要生成geohash
,您可以使用名为geofire-common的库。
npm install geofire-common
geohashForLocation
函数接受 Latitude 和经度作为输入,并返回 location 的geohash
await setDoc(doc(db, "cities", "LA"), {
name: "Los Angeles",
lat: 34.0,
long: -118.2,
// store geohash
geohash: geofire.geohashForLocation([lat, lng]),
});
注意: GeoFire库可用于 swift , kotlin , java 也很强>,也使您也可以在移动应用程序中使用它。
在半径内查询位置
将geohash
添加到数据中后,您现在可以从数据库开始查询位置。
const getCitiesWithinRadius = async (
radiusInM: number,
center: [number, number]
) => {
const bounds = geofire.geohashQueryBounds(
center,
radiusInM
);
const promises = [];
for (const bound of bounds) {
const q = query(
collection(db, "cities"),
orderBy("geoHash"),
startAt(bound[0]),
endAt(bound[1])
);
promises.push(getDocs(q));
}
const snapShots = await Promise.all(promises);
const cities = snapShots
.flatMap((snapShot) => snapShot.docs)
.map((doc) => doc.data());
return cities;
};
getCitiesWithinRadius
将接受米> 中的半径,坐标( latitude && aterutity )作为输入&返回指定半径内的所有城市。
注意:要保持代码清洁&易于阅读, 9行已被分解为还有几行,如果干净的代码不是您的事,您甚至可以使用单线。
限制
作为 firebase 文档:
边缘案例 - 此查询方法依赖于估计经度/纬度线之间的距离。随着要点越来越靠近北极或南极,该估计值的准确性降低了,这意味着Geohash查询在极端的纬度上具有更多的假阳性。
要删除误报,您可以将distanceBetween
函数从geofire-common
库中使用 过滤出半径外的城市,这需要需要其他计算。
const filteredCities = cities.filter((city) => {
const distanceInM = geofire.distanceBetween(
[city.lat, city.long],
center
);
return distanceInM <= radiusInM;
});
return filteredCities;
包起来
恭喜!
现在基于位置的搜索不再是火箭科学,而是几行代码! ð
世界是您的游乐场! ð
PS :向我的朋友Bikram大喊大叫,以挖掘Firebase docs并嗅出这一令人难以置信的功能
谢谢阅读
需要一个最高评价的前端开发自由职业者才能砍掉您的开发困境吗?通过Upwork
与我联系想看看我在做什么?查看我的Personal Website和GitHub
想连接吗?在LinkedIn
上与我联系在Instagram上关注我以查看我最近的工作。
在Dev
上关注我的博客常见问题
这些是我遇到的一些常见问题。因此,我希望这个常见问题部分解决了您的问题。
-
我是初学者,我应该如何学习前端Web Dev?
研究以下文章: -
你会指导我吗?
抱歉,我已经有很多工作量,没有时间指导任何人。