从Mercator投影拉伸中防止基于纬度/经度的块系统

时间:2017-12-01 16:08:14

标签: c# google-maps unity3d mapbox map-projections

我正在开发一个基于mapbox的小游戏,我目前正在开发基于lat / lng的块系统。它们之间的距离应该相同。正如您在示例中所看到的,每个块的宽度和高度相等。小灰色正方形只是大块中间。这些块是在纬度/经度零附近创建的,它们不受墨卡托投影的影响。

Chunks One

但是由于墨卡托投影,大块之间的距离越来越远,因为它们远离中间(它们看起来有点拉伸)。

Chunk Two

正如您所看到的,每个之间的距离不再相等。每个块的高度确实增加了。下面是另一张关于墨卡托投影的图片,可视化我的意思:

enter image description here

第一张照片的大块是在字图中间附近创建的(大黑色上箭头指向的位置) 第二张照片中的块是在世界地图底部附近创建的,另一个箭头指向的位置。

正在开发的游戏类型需要相同的块大小,并且看起来不那么好,因为在某些时候由于拉伸,块看起来不同。

我想在mercator投影上实现这样的块系统:

enter image description here

我按如下方式计算块:

First we need the player lat/lng coordinates: 3.0146683, 5.3046076

One latitude is about: 110.57 km -> 110570 meters
One longitude is about: 111.32 km ->111320 meters

One chunk should be about 750 meters on the map.

Because Latitude and Longitude got different ranges we need to adjust the chunk size.

One latitude factor = 110570 / 750 = 147,43
One longitude factor = 111320 / 750 = 148,42

One latitude chunk size = 110570 / 147 = 750 meters
One longitude chunk size = 111320 / 148,42 = 750 meters

(Maybe this step is unnecessary)


Now we convert the Lat/Lng to meters.

Latitude in Meter = 3.0146683 * 110570 meters = 333 331.873931 Meters
Longitude in Meter = 5.3046076* 111320 meters = 590 508.918032 Meters


Now we need to calculate the meters till the last chunk by using modulo.

Latitude Modulo => 333 331.873931 modulo 750 = 331 meter
Longitude Modulo => 590 508.918032 modulo 750 = 258 meter


After that we are able to calculate the Latitude and Longitude chunks.

Latitude chunk position = 333 331.873931 - 331 = 333 000.873931
Longitude chunk position = 590 508.918032 -258 = 590 250.918032


When we divide that now through the chunk size we get the actual chunk position.

Chunk X = 333 000.873931 / 750 = 444,0011
Chunk Y = 590 250.918032 / 750 = 787,001

Rounded: Chunk X = 444 ; Chunk Y = 787


Now we know that the player stands right in this chunk [444;787]

In the next step I just calculate the Chunk X and Y back to latitude and 
longitude and convert them via transform.AsUnityPosition to 3D coordinates, 
where I place those grey objects then.

所以基本上我需要一种方法来在每个块之间保持相同的视觉距离。或者是一种将投影从mercator更改为方形投影的方法,其中没有任何东西被拉伸。我之前从未使用过mapbox / googlemaps ...所以我是新手。或者是否可以使用一个公式来防止我的块被墨卡托投影拉伸?

0 个答案:

没有答案