【问题标题】:Geographic coordinates to screen coordinates algorithm地理坐标转屏幕坐标算法
【发布时间】:2013-09-09 17:30:03
【问题描述】:

我正在开发一个跨平台移动应用程序,它将位置作为地理坐标存储到数据库中,每个点都代表图形对象的左上角。

此应用程序包含一个支持地理坐标的地图控件(来自 telerik 的 radmap),因此,您只需添加矩形并正确绘制它。

由于许可问题,我无法在 android 版本中使用地图控件(谷歌不允许我们将地图控件用于商业应用程序 - https://developers.google.com/maps/faq#tos_commercial,对于 ios 我仍然没有检查这个),所以我将使用图像作为背景。

我得到了“地图/图像”的左上角和右下角地理坐标,我必须在由角定义的区域内绘制图形对象。

谁能帮我发现如何将地理坐标转换为屏幕坐标。

数据示例(X,Y):

        GEO   

左上角:

-0,00939846 -0,00504255

右下角:

0,009398461 -0,01281023

要绘制的点:

-0.00464558,-0.00799298

-0.0046509,-0.00845432

-0.00386774,-0.00860988

-0.00344932,-0.00860452

        SCREEN

左上角:

0 0

右下角:

? ?

要绘制的点

? ?

屏幕尺寸

1024 * 768

感谢您的帮助,

路易斯·皮尼奥

【问题讨论】:

  • 您已标记 Monodroid 和 Monotouch。这实际上是一个 Xamarin 应用程序吗?
  • 是的,我正在使用 Xamarin 试用版(目前)并计划购买营业执照。

标签: android ios xamarin.ios xamarin.android geo


【解决方案1】:

我在iOS 中最流利,所以这就是我的答案。我尝试制作尽可能多的变量,以便您可以手动/以编程方式覆盖它们而无需更改太多其他代码。

- (CGPoint)convertGeoPoint:(CGPoint)point toView:(UIView*)view {
    CGPoint geoTopLeft = CGPointMake(-0.00939846, -0.00504255);
    CGPoint geoBottomRight = CGPointMake(0.009398461, -0.01281023);
    CGFloat geoWidth = geoBottomRight.x - geoTopLeft.x;
    CGFloat geoHeight = geoBottomRight.y - geoTopLeft.y;

    // This is the block you would change to suit your needs
    CGPoint viewTopLeft = CGPointMake(view.frame.origin.x, view.frame.origin.y);
    CGFloat viewWidth = view.frame.size.width;
    CGFloat viewHeight = view.frame.size.height;

    return CGPointMake(viewTopLeft.x + (point.x-geoTopLeft.x)*viewWidth/geoWidth, viewTopLeft.y + (point.y-geoTopLeft.y)*viewHeight/geoHeight);
}

基本思路是需要将点转换成新的坐标系。为此,您需要除以相应的地理维度并乘以相应的视图维度。

【讨论】:

  • 嗨 Sam,我正在 excel 中运行你的代码(我现在没有任何可用的 osx - 把它留在办公室 - 在 xCode 上运行它)。根据我的模拟,结果似乎很有希望,至少我使用该算法正确运行的测试。非常感谢!!!
  • 很高兴为您提供帮助!如果它最终没有按您的预期工作,请告诉我。
猜你喜欢
  • 2017-03-04
  • 1970-01-01
  • 2017-02-05
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多