问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在iOS地图上高效的显示大量数据

发布网友 发布时间:2022-04-23 21:32

我来回答

5个回答

热心网友 时间:2022-04-14 05:46

  为了达到这个目的,我们需要构造一个可快速检索的数据结构。C语言的性能高,所以我们用C语言来构造这个数据结构。为了确保大量的数据不会让用户感到迷惑,所以我们还需要想出一个合并数据的解决方案。最后,为了更好的适应市场,我们需要把app做的更完善一些。
  完成这个教学后,你将学到这款app的所有核心内容。

  数据结构
  首先我们先来分析下数据,搞清我们要如何处理数据。旅馆数据中包含了一系列的坐标点(包括纬度和经度),我们需要根据这些坐标点在地图上进行标注。地图可以任意的拖动并放大缩小,所以我们不需要把所有的点都全部绘制出来,我们只需要绘制可以显示在屏幕上的点。核心问题是:我们需要查询出显示在屏幕上的所有的点,所以我们要想出一个查找算法,查找存在于一个矩形范围内的所有点。
  一个简单的解决方式就是遍历所有的点,然后判断(xMin<=x<=xMax并且yMin<=y<=yMax),很不幸,这是一个复杂度为O(N)的算法,显然不适合我们的情况。
  这儿有个更好的解决方法,就是我们可以利用对称性来减少我们的查询范围。那么如何能通过查询的每一次的迭代来减少查询的范围呢?我们可以在每个区域内都加索引,这样可以有效减少查询的范围。这种区域索引的方式可以用四叉树来实现,查询复杂度为O(H)(H是查询的那个点所在的树的高度)
  四叉树
  四叉树是一个数据结构,由一系列的结点(node)构成。每个结点包含一个桶(bucket)跟一个包围框(boundingbox)。每个桶里面有一系列的点(point)。如果一个点包含在一个外包围框A中,就会被添加到A所在结点的桶(bucket)中。一旦这个结点的桶满了,这个结点就会*成四个子结点,每个子节点的包围框分别是当前结点包围框的1/4。*之后那些本来要放到当前结点桶中的点就都会放到子容器的桶中。
  那么我们该如何来对四叉树进行编码呢?
  我们先来定义基本的结构:
  typedef struct TBQuadTreeNodeData {
  double x;
  double y;
  void * data;
  } TBQuadTreeNodeData;
  TBQuadTreeNodeData TBQuadTreeNodeDataMake( double x, double y, void * data);
  
  typedef struct TBBoundingBox {
  double x0; double y0;
  double xf; double yf;
  } TBBoundingBox;
  TBBoundingBox TBBoundingBoxMake( double x0, double y0, double xf, double yf);
  
  typedef struct quadTreeNode {
  struct quadTreeNode* northWest;
  struct quadTreeNode* northEast;
  struct quadTreeNode* southWest;
  struct quadTreeNode* southEast;
  TBBoundingBox boundingBox;
  int bucketCapacity;
  TBQuadTreeNodeData *points;
  int count;
  } TBQuadTreeNode;
  TBQuadTreeNode* TBQuadTreeNodeMake(TBBoundingBox boundary, int bucketCapacity);
  TBQuadTreeNodeData结构包含了坐标点(纬度,经度)。void*data是一个普通的指针,用来存储我们需要的其他信息,如旅馆名跟电话号码。TBBoundingBox代表一个用于范围查询的长方形,也就是之前谈到(xMin<=x<=xMax&&yMin<=y<=yMax)查询的那个长方形。左上角是(xMin,yMin),右下角是(xMax,yMax)。
  最后,我们看下TBQuadTreeNode结构,这个结构包含了四个指针,每个指针分别指向这个结点的四个子节点。它还有一个外包围框和一个数组(数组中就是那个包含一系列坐标点的桶)。
  在我们建立完四叉树的同时,空间上的索引也就同时形成了。这是生成四叉树的演示动画。

  下面的代码准确描述了以上动画的过程:
  void TBQuadTreeNodeSubdivide(TBQuadTreeNode* node)
  {
  TBBoundingBox box = node->boundingBox;
  
  double xMid = (box.xf + box.x0) / 2.0;
  double yMid = (box.yf + box.y0) / 2.0;
  
  TBBoundingBox northWest = TBBoundingBoxMake(box.x0, box.y0, xMid, yMid);
  node->northWest = TBQuadTreeNodeMake(northWest, node->bucketCapacity);
  
  TBBoundingBox northEast = TBBoundingBoxMake(xMid, box.y0, box.xf, yMid);
  node->northEast = TBQuadTreeNodeMake(northEast, node->bucketCapacity);
  
  TBBoundingBox southWest = TBBoundingBoxMake(box.x0, yMid, xMid, box.yf);
  node->southWest = TBQuadTreeNodeMake(southWest, node->bucketCapacity);
  
  TBBoundingBox southEast = TBBoundingBoxMake(xMid, yMid, box.xf, box.yf);
  node->southEast = TBQuadTreeNodeMake(southEast, node->bucketCapacity);
  }
  
  bool TBQuadTreeNodeInsertData(TBQuadTreeNode* node, TBQuadTreeNodeData data)
  {
  // Bail if our coordinate is not in the boundingBox
  if (!TBBoundingBoxContainsData(node->boundingBox, data)) {
  return false ;
  }
  
  // Add the coordinate to the points array
  if (node->count < node->bucketCapacity) {
  node->points[node->count++] = data;
  return true ;
  }
  
  // Check to see if the current node is a leaf, if it is, split
  if (node->northWest == NULL) {
  TBQuadTreeNodeSubdivide(node);
  }
  
  // Traverse the tree
  if (TBQuadTreeNodeInsertData(node->northWest, data)) return true ;
  if (TBQuadTreeNodeInsertData(node->northEast, data)) return true ;
  if (TBQuadTreeNodeInsertData(node->southWest, data)) return true ;
  if (TBQuadTreeNodeInsertData(node->southEast, data)) return true ;
  
  return false ;
  }
  现在我们已经完成了四叉树的构造,我们还需要在四叉树上进行区域范围查询并返回TBQuadTreeNodeData结构。以下是区域范围查询的演示动画,在浅蓝区域内的是所有的标注点。当标注点被查询到在指定的区域范围内,则会被标注为绿色。
  以下是查询代码:
  typedef void (^TBDataReturnBlock)(TBQuadTreeNodeData data);
  
  void TBQuadTreeGatherDataInRange(TBQuadTreeNode* node, TBBoundingBox range, TBDataReturnBlock block)
  {
  // If range is not contained in the node's boundingBox then l
  if (!TBBoundingBoxIntersectsBoundingBox(node->boundingBox, range)) {
  return ;
  }
  
  for ( int i = 0; i < node->count; i++) {
  // Gather points contained in range
  if (TBBoundingBoxContainsData(range, node->points[i])) {
  block(node->points[i]);
  }
  }
  
  // Bail if node is leaf
  if (node->northWest == NULL) {
  return ;
  }
  
  // Otherwise traverse down the tree
  TBQuadTreeGatherDataInRange(node->northWest, range, block);
  TBQuadTreeGatherDataInRange(node->northEast, range, block);
  TBQuadTreeGatherDataInRange(node->southWest, range, block);
  TBQuadTreeGatherDataInRange(node->southEast, range, block);
  }
  用四叉树这种结构可以进行快速的查询。在一个包含成百上千条数据的数据库中,可以以60fps的速度查询上百条数据。
  用旅馆数据来填充四叉树
  旅馆的数据来自于POIplaza这个网站,而且已经格式化成csv文件。我们要从硬盘中读取出数据并对数据进行转换,最后用数据来填充四叉树。
  创建四叉树的代码在TBCoordinateQuadTree类中:
  typedef struct TBHotelInfo {
  char * hotelName;
  char * hotelPhoneNumber;
  } TBHotelInfo;
  
  TBQuadTreeNodeData TBDataFromLine(NSString *line)
  {
  // Example line:
  
  
  NSArray *components = [line componentsSeparatedByString:@ "," ];
  double latitude = [components[1] doubleValue];
  double longitude = [components[0] doubleValue];
  
  TBHotelInfo* hotelInfo = malloc( sizeof (TBHotelInfo));
  
  NSString *hotelName = [components[2] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  hotelInfo->hotelName = malloc( sizeof ( char ) * hotelName.length + 1);
  strncpy(hotelInfo->hotelName, [hotelName UTF8String], hotelName.length + 1);
  
  NSString *hotelPhoneNumber = [[components lastObject] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  hotelInfo->hotelPhoneNumber = malloc( sizeof ( char) * hotelPhoneNumber.length + 1);
  strncpy(hotelInfo->hotelPhoneNumber, [hotelPhoneNumber UTF8String], hotelPhoneNumber.length + 1);
  
  return TBQuadTreeNodeDataMake(latitude, longitude, hotelInfo);
  }
  
  - ( void )buildTree
  {
  NSString *data = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@ "USA-HotelMotel" ofType:@"csv" ] encoding:NSASCIIStringEncoding error:nil];
  NSArray *lines = [data componentsSeparatedByString:@ "\n" ];
  
  NSInteger count = lines.count - 1;
  
  TBQuadTreeNodeData *dataArray = malloc( sizeof(TBQuadTreeNodeData) * count);
  for (NSInteger i = 0; i < count; i++) {
  dataArray[i] = TBDataFromLine(lines[i]);
  }
  
  TBBoundingBox world = TBBoundingBoxMake(19, -166, 72, -53);
  _root = TBQuadTreeBuildWithData(dataArray, count, world, 4);
  }
  现在我们用iPhone上预加载的数据创建了一个四叉树。接下来我们将处理app的下一个部分:合并数据(clustering)。
  合并数据(clustering)
  现在我们有了一个装满旅馆数据的四叉树,可以用来解决合并数据的问题了。首先,让我们来探索下合并数据的原因。我们合并数据是因为我们不想因为数据过于庞大而使用户迷惑。实际上有很多种方式可以解决这个问题。GoogleMaps根据地图的缩放等级(zoomlevel)来显示搜索结果数据中的一部分数据。地图放的越大,就越能清晰的看到更细节的标注,直到你能看到所有有效的标注。我们将采用这种合并数据的方式,只显示出来旅馆的个数,而不在地图上显示出所有的旅馆信息。
  最终呈现的标注是一个中心显示旅馆个数的小圆圈。实现的原理跟如何把图片缩小的原理差不多。我们先在地图上画一个格子。每个格子中包含了很多个小单元格,每个小单元格中的所有旅馆数据合并出一个标注。然后通过每个小单元格中所有旅馆的坐标值的平均值来决定合并后这个标注的坐标值。

热心网友 时间:2022-04-14 07:04

 为了达到这个目的,我们需要构造一个可快速检索的数据结构。C语言的性能高,所以我们用C语言来构造这个数据结构。为了确保大量的数据不会让用户感到迷惑,所以我们还需要想出一个合并数据的解决方案。最后,为了更好的适应市场,我们需要把app做的更完善一些。
  完成这个教学后,你将学到这款app的所有核心内容。

  数据结构
  首先我们先来分析下数据,搞清我们要如何处理数据。旅馆数据中包含了一系列的坐标点(包括纬度和经度),我们需要根据这些坐标点在地图上进行标注。地图可以任意的拖动并放大缩小,所以我们不需要把所有的点都全部绘制出来,我们只需要绘制可以显示在屏幕上的点。核心问题是:我们需要查询出显示在屏幕上的所有的点,所以我们要想出一个查找算法,查找存在于一个矩形范围内的所有点。
  一个简单的解决方式就是遍历所有的点,然后判断(xMin<=x<=xMax并且yMin<=y<=yMax),很不幸,这是一个复杂度为O(N)的算法,显然不适合我们的情况。
  这儿有个更好的解决方法,就是我们可以利用对称性来减少我们的查询范围。那么如何能通过查询的每一次的迭代来减少查询的范围呢?我们可以在每个区域内都加索引,这样可以有效减少查询的范围。这种区域索引的方式可以用四叉树来实现,查询复杂度为O(H)(H是查询的那个点所在的树的高度)
  四叉树
  四叉树是一个数据结构,由一系列的结点(node)构成。每个结点包含一个桶(bucket)跟一个包围框(boundingbox)。每个桶里面有一系列的点(point)。如果一个点包含在一个外包围框A中,就会被添加到A所在结点的桶(bucket)中。一旦这个结点的桶满了,这个结点就会*成四个子结点,每个子节点的包围框分别是当前结点包围框的1/4。*之后那些本来要放到当前结点桶中的点就都会放到子容器的桶中。
  那么我们该如何来对四叉树进行编码呢?
  我们先来定义基本的结构:
  typedef struct TBQuadTreeNodeData {
  double x;
  double y;
  void * data;
  } TBQuadTreeNodeData;
  TBQuadTreeNodeData TBQuadTreeNodeDataMake( double x, double y, void * data);
  
  typedef struct TBBoundingBox {
  double x0; double y0;
  double xf; double yf;
  } TBBoundingBox;
  TBBoundingBox TBBoundingBoxMake( double x0, double y0, double xf, double yf);
  
  typedef struct quadTreeNode {
  struct quadTreeNode* northWest;
  struct quadTreeNode* northEast;
  struct quadTreeNode* southWest;
  struct quadTreeNode* southEast;
  TBBoundingBox boundingBox;
  int bucketCapacity;
  TBQuadTreeNodeData *points;
  int count;
  } TBQuadTreeNode;
  TBQuadTreeNode* TBQuadTreeNodeMake(TBBoundingBox boundary, int bucketCapacity);
  TBQuadTreeNodeData结构包含了坐标点(纬度,经度)。void*data是一个普通的指针,用来存储我们需要的其他信息,如旅馆名跟电话号码。TBBoundingBox代表一个用于范围查询的长方形,也就是之前谈到(xMin<=x<=xMax&&yMin<=y<=yMax)查询的那个长方形。左上角是(xMin,yMin),右下角是(xMax,yMax)。
  最后,我们看下TBQuadTreeNode结构,这个结构包含了四个指针,每个指针分别指向这个结点的四个子节点。它还有一个外包围框和一个数组(数组中就是那个包含一系列坐标点的桶)。
  在我们建立完四叉树的同时,空间上的索引也就同时形成了。这是生成四叉树的演示动画。

  下面的代码准确描述了以上动画的过程:
  void TBQuadTreeNodeSubdivide(TBQuadTreeNode* node)
  {
  TBBoundingBox box = node->boundingBox;
  
  double xMid = (box.xf + box.x0) / 2.0;
  double yMid = (box.yf + box.y0) / 2.0;
  
  TBBoundingBox northWest = TBBoundingBoxMake(box.x0, box.y0, xMid, yMid);
  node->northWest = TBQuadTreeNodeMake(northWest, node->bucketCapacity);
  
  TBBoundingBox northEast = TBBoundingBoxMake(xMid, box.y0, box.xf, yMid);
  node->northEast = TBQuadTreeNodeMake(northEast, node->bucketCapacity);
  
  TBBoundingBox southWest = TBBoundingBoxMake(box.x0, yMid, xMid, box.yf);
  node->southWest = TBQuadTreeNodeMake(southWest, node->bucketCapacity);
  
  TBBoundingBox southEast = TBBoundingBoxMake(xMid, yMid, box.xf, box.yf);
  node->southEast = TBQuadTreeNodeMake(southEast, node->bucketCapacity);
  }
  
  bool TBQuadTreeNodeInsertData(TBQuadTreeNode* node, TBQuadTreeNodeData data)
  {
  // Bail if our coordinate is not in the boundingBox
  if (!TBBoundingBoxContainsData(node->boundingBox, data)) {
  return false ;
  }
  
  // Add the coordinate to the points array
  if (node->count < node->bucketCapacity) {
  node->points[node->count++] = data;
  return true ;
  }
  
  // Check to see if the current node is a leaf, if it is, split
  if (node->northWest == NULL) {
  TBQuadTreeNodeSubdivide(node);
  }
  
  // Traverse the tree
  if (TBQuadTreeNodeInsertData(node->northWest, data)) return true ;
  if (TBQuadTreeNodeInsertData(node->northEast, data)) return true ;
  if (TBQuadTreeNodeInsertData(node->southWest, data)) return true ;
  if (TBQuadTreeNodeInsertData(node->southEast, data)) return true ;
  
  return false ;
  }
  现在我们已经完成了四叉树的构造,我们还需要在四叉树上进行区域范围查询并返回TBQuadTreeNodeData结构。以下是区域范围查询的演示动画,在浅蓝区域内的是所有的标注点。当标注点被查询到在指定的区域范围内,则会被标注为绿色。
  以下是查询代码:
  typedef void (^TBDataReturnBlock)(TBQuadTreeNodeData data);
  
  void TBQuadTreeGatherDataInRange(TBQuadTreeNode* node, TBBoundingBox range, TBDataReturnBlock block)
  {
  // If range is not contained in the node's boundingBox then l
  if (!TBBoundingBoxIntersectsBoundingBox(node->boundingBox, range)) {
  return ;
  }
  
  for ( int i = 0; i < node->count; i++) {
  // Gather points contained in range
  if (TBBoundingBoxContainsData(range, node->points[i])) {
  block(node->points[i]);
  }
  }
  
  // Bail if node is leaf
  if (node->northWest == NULL) {
  return ;
  }
  
  // Otherwise traverse down the tree
  TBQuadTreeGatherDataInRange(node->northWest, range, block);
  TBQuadTreeGatherDataInRange(node->northEast, range, block);
  TBQuadTreeGatherDataInRange(node->southWest, range, block);
  TBQuadTreeGatherDataInRange(node->southEast, range, block);
  }
  用四叉树这种结构可以进行快速的查询。在一个包含成百上千条数据的数据库中,可以以60fps的速度查询上百条数据。
  用旅馆数据来填充四叉树
  旅馆的数据来自于POIplaza这个网站,而且已经格式化成csv文件。我们要从硬盘中读取出数据并对数据进行转换,最后用数据来填充四叉树。
  创建四叉树的代码在TBCoordinateQuadTree类中:
  typedef struct TBHotelInfo {
  char * hotelName;
  char * hotelPhoneNumber;
  } TBHotelInfo;
  
  TBQuadTreeNodeData TBDataFromLine(NSString *line)
  {
  // Example line:
  
  
  NSArray *components = [line componentsSeparatedByString:@ "," ];
  double latitude = [components[1] doubleValue];
  double longitude = [components[0] doubleValue];
  
  TBHotelInfo* hotelInfo = malloc( sizeof (TBHotelInfo));
  
  NSString *hotelName = [components[2] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  hotelInfo->hotelName = malloc( sizeof ( char ) * hotelName.length + 1);
  strncpy(hotelInfo->hotelName, [hotelName UTF8String], hotelName.length + 1);
  
  NSString *hotelPhoneNumber = [[components lastObject] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  hotelInfo->hotelPhoneNumber = malloc( sizeof ( char) * hotelPhoneNumber.length + 1);
  strncpy(hotelInfo->hotelPhoneNumber, [hotelPhoneNumber UTF8String], hotelPhoneNumber.length + 1);
  
  return TBQuadTreeNodeDataMake(latitude, longitude, hotelInfo);
  }
  
  - ( void )buildTree
  {
  NSString *data = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@ "USA-HotelMotel" ofType:@"csv" ] encoding:NSASCIIStringEncoding error:nil];
  NSArray *lines = [data componentsSeparatedByString:@ "\n" ];
  
  NSInteger count = lines.count - 1;
  
  TBQuadTreeNodeData *dataArray = malloc( sizeof(TBQuadTreeNodeData) * count);
  for (NSInteger i = 0; i < count; i++) {
  dataArray[i] = TBDataFromLine(lines[i]);
  }
  
  TBBoundingBox world = TBBoundingBoxMake(19, -166, 72, -53);
  _root = TBQuadTreeBuildWithData(dataArray, count, world, 4);
  }
  现在我们用iPhone上预加载的数据创建了一个四叉树。接下来我们将处理app的下一个部分:合并数据(clustering)。
  合并数据(clustering)
  现在我们有了一个装满旅馆数据的四叉树,可以用来解决合并数据的问题了。首先,让我们来探索下合并数据的原因。我们合并数据是因为我们不想因为数据过于庞大而使用户迷惑。实际上有很多种方式可以解决这个问题。GoogleMaps根据地图的缩放等级(zoomlevel)来显示搜索结果数据中的一部分数据。地图放的越大,就越能清晰的看到更细节的标注,直到你能看到所有有效的标注。我们将采用这种合并数据的方式,只显示出来旅馆的个数,而不在地图上显示出所有的旅馆信息。
  最终呈现的标注是一个中心显示旅馆个数的小圆圈。实现的原理跟如何把图片缩小的原理差不多。我们先在地图上画一个格子。每个格子中包含了很多个小单元格,每个小单元格中的所有旅馆数据合并出一个标注。然后通过每个小单元格中所有旅馆的坐标值的平均值来决定合并后这个标注的坐标值。

热心网友 时间:2022-04-14 08:39

1、ios系统更新,首先是下载系统更新文件,然后就是把升级系统安装到设备上面;下载升级文件可以在苹果设备上面直接下载,然后进入到更新程序里面点击在线联网更新,还可以是在电脑端下载更新程序文件,然后使用电脑更新升级。更新系统程序存在风险,所以更新系统要慎重。
2、尤其是在设备端直接更新升级出现的问题率是很高的。在设备端直接更新,打开设置——通用——软件更新,系统在更新的时候,设备的可用内存空间一定要到达系统最低的要求,否则无法进行只更新。
3、使用电脑更新系统的优势在于安全稳定快速,出现的问题率比较低。在电脑端安装iTunes软件程序,然后使用数据线连接*电脑,系统在同步扫描手机信息的时候,就会自动提示更新手机系统,然后点击更新下载,下载完之后就可以开始同步更新到设备上面,来完成设备系统的升级。
4、更新系统升级之前最好把重要的文件备份一下然后在升级,然后还可以同步恢复到设备上面来。

热心网友 时间:2022-04-14 10:30

用图表的形式吧

热心网友 时间:2022-04-14 12:38

使用iPad即可
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... 苹果手机自带地图好用吗? bigemap IOS如何添加在线地图? IOS地图软件最好用路线最全的是哪个 iOS 13 的全新地图体验有什么功能? 台式机电源风扇很响一般是怎么回事? ios11苹果地图怎么导航 请问台式机电源风扇噪音太大,可以自己更换一个吗? ios15怎么使用ar地图 台式机电源的风扇应该朝哪边? ios15地图不显示小区 台式机电源风扇如何区别?哪里购买? ios15地图怎么用国际版 台式机电源风扇声音大该怎么解决 苹果ios14自带地图好用吗? ios15地图怎么变成3d模式? 两个台式机的散热风扇一小时要多少W的电? 骨髓细胞的骨髓细胞参考值 比较中幼红浆细胞淋巴细胞鉴别要点? 电脑台式机一插上电就风扇能转一下停不下来然后3长声4断声? 为什么原始细胞很少,骨髓中的原始细胞从哪里来的呢 苹果在中国是不是一直都选用的高德地图作为iOS内置地图 ios地图怎么看经纬度 iOS 平台的高德地图和百度地图,哪个更好?各有什么特点 ios12苹果地图有哪些更新 夸奖老师尽职尽责简短话有哪些? 赞美教师职业的唯美简短句子有哪些? 夸赞老师辛苦付出的简短句子有哪些? 关于赞美老师年轻漂亮的句子有哪些? 求赞美老师的句子,朴实简短 对政治老师赞美的句子!!急求!! 赞美幼儿园老师的话 简短真实? 什么地图可以把山放倒 已经不用了,绑定的银行卡如何消除 土豆丝炒面的做法,土豆丝炒面怎么做好吃,土豆 的做法,土豆丝炒面怎么做好吃,土豆丝炒面的家常做法 怎么炒出来的土豆丝才能很面 关于土豆丝的各种各样的炒法。 《恰到好处的幸福(2017版)》epub下载在线阅读全文,求百度网盘云资源 恰到好处的幸福txt书包网 请大神帮忙找本书《恰到好处的幸福》