0

我正在使用 arcgis 为 ios 制作一个应用程序,该应用程序允许用户通过拖动手指在地图上自由绘制(红线)。我曾尝试使用 arcgis 提供的草图层示例来实现这一点,但没有运气。我也尝试使用 opengl,但我的绘图并没有停留在它绘制的位置。简而言之,我试图做的是在地图上徒手绘制,当我平移和缩放地图时,绘图会停留在绘制它的地图上的坐标处,并根据缩放进行拉伸和收缩。

使用 opengl 视图,我能够绘制。我的问题是我需要让图纸保持在地质坐标上。这是我的绘图代码。目前我正在获取屏幕上x和y的触摸坐标,需要将其更改为地图上的经度和纬度,然后将其转换为屏幕上的x和y。我不知道该怎么做。

    // Drawings a line onscreen based on where the user touches
    - (void) renderLineFromPoint:(CGPoint)start toPoint:(CGPoint)end
    {
         static GLfloat*     vertexBuffer = NULL;
         static NSUInteger   vertexMax = 64;
         NSUInteger vertexCount = 0, count, i;
         [EAGLContext setCurrentContext:context];
         glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);

    // Convert locations from Points to Pixels
         CGFloat scale = self.contentScaleFactor;
         start.x *= scale;
         start.y *= scale;
         end.x *= scale;
         end.y *= scale;

    // Allocate vertex array buffer
         if(vertexBuffer == NULL)
         vertexBuffer = malloc(vertexMax * 2 * sizeof(GLfloat));

    // Add points to the buffer so there are drawing points every X pixels
         count = MAX(ceilf(sqrtf((end.x - start.x) * (end.x - start.x) + (end.y -start.y) * (end.y - start.y)) / kBrushPixelStep), 1);
         for(i = 0; i < count; ++i) 
         {
              if(vertexCount == vertexMax) 
              {
                   vertexMax = 2 * vertexMax;
                   vertexBuffer = realloc(vertexBuffer, vertexMax * 2 * sizeof GLfloat));
              }
              vertexBuffer[2 * vertexCount + 0] = start.x + (end.x - start.x) * ((GLfloat)i / (GLfloat)count);
              vertexBuffer[2 * vertexCount + 1] = start.y + (end.y - start.y) * ((GLfloat)i / (GLfloat)count);
              vertexCount += 1;
         }

    // Render the vertex array
         glVertexPointer(2, GL_FLOAT, 0, vertexBuffer);
         glDrawArrays(GL_POINTS, 0, vertexCount);

    // Display the buffer
         glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
         [context presentRenderbuffer:GL_RENDERBUFFER_OES];
    }

// Reads previously recorded points and draws them onscreen. This is the 
Shake Me message that appears when the application launches.
- (void) playback:(NSMutableArray*)recordedPaths
{
    NSData* data = [recordedPaths objectAtIndex:0];
    CGPoint* point = (CGPoint*)[data bytes];
    NSUInteger count = [data length] / sizeof(CGPoint), i;
    // Render the current path
    for(i = 0; i < count - 1; ++i, ++point)
        [self renderLineFromPoint:*point toPoint:*(point + 1)];
    // Render the next path after a short delay 
    [recordedPaths removeObjectAtIndex:0];
    if([recordedPaths count])
        [self performSelector:@selector(playback:) withObject:recordedPaths 
    afterDelay:0.01];
}

// Handles the start of a touchPaintingView.m 12-08-07 9:34 AM
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
     CGRect bounds = [self bounds];
     UITouch*    touch = [[event touchesForView:self] anyObject];
     firstTouch = YES;
     // Convert touch point from UIView referential to OpenGL one (upside-down flip)
     location = [touch locationInView:self];
     location.y = bounds.size.height - location.y;
}

// Handles the continuation of a touch.
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{  

     CGRect bounds = [self bounds];
     UITouch* touch = [[event touchesForView:self] anyObject];

     // Convert touch point from UIView referential to OpenGL one (upside-down flip)
     if (firstTouch) 
     {
         firstTouch = NO;
         previousLocation = [touch previousLocationInView:self];
         previousLocation.y = bounds.size.height - previousLocation.y;
     }
     else 
     {
         location = [touch locationInView:self];
         location.y = bounds.size.height - location.y;
         previousLocation = [touch previousLocationInView:self];
         previousLocation.y = bounds.size.height - previousLocation.y;
     }

     // Render the stroke
     [self renderLineFromPoint:previousLocation toPoint:location];
}

// Handles the end of a touch event when the touch is a tap.
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
     CGRect bounds = [self bounds];
     UITouch*    touch = [[event touchesForView:self] anyObject];
     if (firstTouch) 
     {
          firstTouch = NO;
          previousLocation = [touch previousLocationInView:self];
          previousLocation.y = bounds.size.height - previousLocation.y;
          [self renderLineFromPoint:previousLocation toPoint:location];
     }
}
4

1 回答 1

1

为了这

“目前我正在获取屏幕上 x 和 y 的触摸坐标,需要将其更改为地图上的经度和纬度,然后将其转换为屏幕上的 x 和 y。我不知道该怎么做。”

我建议将触摸笔画的所有坐标保存在一个数组中,然后将这些坐标添加到 AGSPolyline。方法如下

  1. 为数组中的每个坐标创建 CGPoint。
  2. 使用 [self.mapview toMapPoint:CGPoint] 将 CGPoint 转换为 AGSPoint
  3. 使用 addpointtopath 方法将点添加到 agspolyline
于 2013-09-17T05:12:15.480 回答