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