Google maps 使用谷歌s2库-查找圆圈内特定级别的所有s2单元格,给定lat/lng和半径(英里/公里)

Google maps 使用谷歌s2库-查找圆圈内特定级别的所有s2单元格,给定lat/lng和半径(英里/公里),google-maps,google-api,Google Maps,Google Api,使用google的s2库,给定纬度、经度和以英里/公里为单位的半径,我应该使用哪个区域以及如何使用它来获取圆内的所有单元格 S2Region region = ? S2RegionCoverer coverer = new S2RegionCoverer(); coverer.setMinLevel(17); coverer.setMaxCells(17); S2CellUnion covering = coverer.getCovering(region_cap); 谢谢这是NPM包S2几何

使用google的s2库,给定纬度、经度和以英里/公里为单位的半径,我应该使用哪个区域以及如何使用它来获取圆内的所有单元格

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

谢谢

这是NPM包S2几何节点的C++示例。代码是从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;
}
const双基思周长=1000*40075.017;
双接地表半径(双米){
返回值(2*M_PI)*(米/基思周长);
}
字符串CellToString(常量S2CellId&id){
返回StringPrintf(“%d:%s”,id.level(),id.ToToken().c_str());
}
//生成目标s2单元级别的单元列表,涵盖
//半径为“半径米”的盖子,中心位于lat和lng。
矢量搜索单元(双lat、双lng、双半径_米、,
整数最小值,整数最大值){
常数双半径弧度=地球仪半径(半径米);
const S2Cap region=S2Cap::FromAxisHeight(
S2LatLng::FromDegrees(lat,lng).Normalized().ToPoint(),
(半径弧度*半径弧度)/2);
s2区域覆盖物覆盖物;
覆盖物。设置最低水平(最低水平);
盖子。设置最大液位(最大液位);
向量覆盖;
覆盖层。覆盖层(区域和覆盖层);
向量v(covering.size());
对于(size_t i=0;i<代码> > P>这是NPM包S2几何节点的C++示例。代码是从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;
}
const双基思周长=1000*40075.017;
双接地表半径(双米){
返回值(2*M_PI)*(米/基思周长);
}
字符串CellToString(常量S2CellId&id){
返回StringPrintf(“%d:%s”,id.level(),id.ToToken().c_str());
}
//生成目标s2单元级别的单元列表,涵盖
//半径为“半径米”的盖子,中心位于lat和lng。
矢量搜索单元(双lat、双lng、双半径_米、,
整数最小值,整数最大值){
常数双半径弧度=地球仪半径(半径米);
const S2Cap region=S2Cap::FromAxisHeight(
S2LatLng::FromDegrees(lat,lng).Normalized().ToPoint(),
(半径弧度*半径弧度)/2);
s2区域覆盖物覆盖物;
覆盖物。设置最低水平(最低水平);
盖子。设置最大液位(最大液位);
向量覆盖;
覆盖层。覆盖层(区域和覆盖层);
向量v(covering.size());
对于(size_t i=0;i
我遇到了相同的任务,并使用
s2regionoverer.getCovering(S2Region-region,ArrayList-covering)
方法解决了它

获取不同级别单元格的原因在
s2regionoverer.getCovering(S2Region)
文档中描述:

/**
   * Return a normalized cell union that covers the given region and satisfies
   * the restrictions *EXCEPT* for min_level() and level_mod(). These criteria
   * cannot be satisfied using a cell union because cell unions are
   * automatically normalized by replacing four child cells with their parent
   * whenever possible. (Note that the list of cell ids passed to the cell union
   * constructor does in fact satisfy all the given restrictions.)
   */

我遇到了同样的任务,并使用
s2regionoverer.getCovering(S2Region-region,ArrayList-covering)
方法解决了它

获取不同级别单元格的原因在
s2regionoverer.getCovering(S2Region)
文档中描述:

/**
   * Return a normalized cell union that covers the given region and satisfies
   * the restrictions *EXCEPT* for min_level() and level_mod(). These criteria
   * cannot be satisfied using a cell union because cell unions are
   * automatically normalized by replacing four child cells with their parent
   * whenever possible. (Note that the list of cell ids passed to the cell union
   * constructor does in fact satisfy all the given restrictions.)
   */

@狼蛛-跟随了你的帖子,但却不知道如何使用圆形区域。感谢您在这方面的帮助。@tarantula-关注了您的帖子,但无法了解如何使用圆形区域。同样感谢你的帮助。