映射到 Forge Viewer

Maps into Forge Viewer

尝试按照步骤进行操作 https://forge.autodesk.com/blog/add-mapbox-google-maps-forge-viewer,但我无法将模型正确放置在地图上。

我是运行这里列出的函数:https://docs.microsoft.com/en-us/bingmaps/articles/bing-maps-tile-system:

  1. LatLongToPixelXY(纬度, 经度, 7, out pixelX, out pixelY);

  2. PixelXYToTileXY(pixelX, pixelY, out tileX, out tileY);

  3. 结果pixelX = 16225, pixelY = 12249, tileX = 63, tileY = 47.

  4. 我替换之前的值:

    map.position.set(16225,12249,-45); class MapPlaneNode 扩展 MapNode { 构造函数(parentNode = null, mapView = null, location = MapNode.ROOT, level = 7, x = 63, y = 47)

结果是模型变小了,而且定位不正确。图中红色箭头是插入模型的地方,绿色箭头是应该插入的地方。

image of result

我做错了什么?

非常感谢

定位模型有点棘手。

在我创建的演示中,我最初使用世界坐标,我将根瓦片设置为级别 0,并使用正确的 lat/long 坐标 utils 函数将 revit 模型定位在正确的位置。 不幸的是,精度导致 post-renderer 出现渲染问题(线边缘丢失,以及一些奇怪的 z-fighting 精度问题)... 所以,我决定修改关卡,将地图移动到我想要的位置,并将 revit 模型居中于原点 0,0,0。

这使事情变得更加手动且相当棘手,但它解决了渲染问题并将用户限制在世界上的一个小区域,这是我更喜欢的。

我建议将根图块改回零,并将模型位置 globaloffset 调整为 lat/long W84 实用程序的值。请参阅博客 post 以及 geo-three 存储库的坐标部分,有关详细信息,请参见此处:https://github.com/tentone/geo-three#coordinates

找到调整地图的技巧。它仍然是手动的,但相当快:

  1. 计算Tile X和Y(这一步你已经做了,仅供参考):

从您发布到 https://dotnetfiddle.net/ 的 link bing-maps-tile-system 复制 TileSystem class (您还需要添加:使用 System.Text)

改主要如下

public static void Main()
{
    int pixelX, pixelY, tileX, tileY;

    TileSystem.LatLongToPixelXY(YOUR LAT HERE, YOUR LONG HERE, 7, out pixelX, out pixelY);
    Console.WriteLine("LatLongToPixelXY: " + pixelX.ToString() + ", " + pixelY.ToString());
    TileSystem.PixelXYToTileXY(pixelX, pixelY, out tileX, out tileY);
    Console.WriteLine("PixelXYToTileXY: " + tileX.ToString() + ", " + tileY.ToString());
}

这将为您提供需要在扩展中替换的 TileX 和 Tile Y。

  1. 计算位置

在 Extension 中将 X、Y 位置设置为 0,0,并调整 Z 使地图位于您的模型下方

map.position.set(0, 0, z);

运行 扩展并查看您的项目在地图上的位置。现在在 Google 地图中找到这个着陆点(我发现在这个阶段通过输入例如:Parker St & Wilson Rd,使用两条街道之间的拐角搜索地图很有用)。找到它后,单击 Google 地图中的着陆点以放置标记,然后右键单击标记并 select 测量距离。您必须垂直和水平(而不是直接到目的地)测量到目的地的距离。例如你会得到 dH = 43.5km 和 dV = 17.8km

这就是奇迹发生的地方:如果距离以公里为单位,则将两个数字乘以 3400(如果距离以英里为单位,则乘以 2113)并使用这些值设置位置:

dH * 3400 = 147900

dV * 3400 = 60520

如果您的目的地是 E 或 S,请使用正值。 如果您的目的地是 W 或 N,请使用负值

map.position.set(147900, -60520, z);

现在还不完美,但已经足够接近手动完成调整值了。