使用google s2库 - 在圆圈内查找某个级别的所有s2单元,以英里/公里为单位给出经度/半径和半径 [英] Using google s2 library - find all s2 cells of a certain level within the circle, given lat/lng and radius in miles/km

查看:2322
本文介绍了使用google s2库 - 在圆圈内查找某个级别的所有s2单元,以英里/公里为单位给出经度/半径和半径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我应该使用什么S2Region,我应该如何使用它来获取经纬度和以英里/公里为单位的半径的所有单元格,并使用google的s2库?

  S2区域区域=? 
S2RegionCoverer coverer =新S2RegionCoverer();
coverer.setMinLevel(17);
coverer.setMaxCells(17);
S2CellUnion覆盖= coverer.getCovering(region_cap);

谢谢

解决方案这是来自npm包s2geometry-node的一个C ++示例。代码是从viewfinder / viewfinder.cc复制的。

  const double kEarthCircumferenceMeters = 1000 * 40075.017; 

双EarthMetersToRadians(双米){
return(2 * M_PI)*(米/ kEarthCircumferenceMeters);


字符串CellToString(const S2CellId& id){
返回StringPrintf(%d:%s,id.level(),id.ToToken()。c_str ());
}

//在目标s2单元格级别生成一个单元格列表,其中包含
//半径为'radius_meters'的上限,中心位于lat& LNG。
vector< string> SearchCells(Double lat,double lng,double radius_meters,
int min_level,int max_level){
const double radius_radians = EarthMetersToRadians(radius_meters);
const S2Cap region = S2Cap :: FromAxisHeight(
S2LatLng :: FromDegrees(lat,lng).Normalized()。ToPoint(),
(radius_radians * radius_radians)/ 2);
S2RegionCoverer coverer;
coverer.set_min_level(min_level);
coverer.set_max_level(max_level);

vector< S2CellId>覆盖;
coverer.GetCovering(地区,&覆盖);
vector< string> V(covering.size());
for(size_t i = 0; i< covering.size(); ++ i){
v [i] = CellToString(覆盖[i]);
}
return v;
}


What S2Region should i use and how should i use it to get all cells within a circle given a latitude, longitude and a radius in miles/km using google's s2 library?

S2Region region = ?
S2RegionCoverer coverer = new S2RegionCoverer();
coverer.setMinLevel(17);
coverer.setMaxCells(17);
S2CellUnion covering = coverer.getCovering(region_cap);

Thanks

解决方案

Here's a C++ example from the npm package s2geometry-node. The code was copied from viewfinder/viewfinder.cc

const double kEarthCircumferenceMeters = 1000 * 40075.017;

double EarthMetersToRadians(double meters) {
  return (2 * M_PI) * (meters / kEarthCircumferenceMeters);
}

string CellToString(const S2CellId& id) {
  return StringPrintf("%d:%s", id.level(), id.ToToken().c_str());
}

// Generates a list of cells at the target s2 cell levels which cover
// a cap of radius 'radius_meters' with center at lat & lng.
vector<string> SearchCells(double lat, double lng, double radius_meters,
                           int min_level, int max_level) {
  const double radius_radians = EarthMetersToRadians(radius_meters);
  const S2Cap region = S2Cap::FromAxisHeight(
      S2LatLng::FromDegrees(lat, lng).Normalized().ToPoint(),
      (radius_radians * radius_radians) / 2);
  S2RegionCoverer coverer;
  coverer.set_min_level(min_level);
  coverer.set_max_level(max_level);

  vector<S2CellId> covering;
  coverer.GetCovering(region, &covering);
  vector<string> v(covering.size());
  for (size_t i = 0; i < covering.size(); ++i) {
    v[i] = CellToString(covering[i]);
  }
  return v;
}

这篇关于使用google s2库 - 在圆圈内查找某个级别的所有s2单元,以英里/公里为单位给出经度/半径和半径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆