【问题标题】:Maps into Forge Viewer映射到 Forge Viewer
【发布时间】:2021-09-08 08:34:15
【问题描述】:

尝试按照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(latitude, longitude, 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); 类 MapPlaneNode 扩展 MapNode { 构造函数(parentNode = null, mapView = null, location = MapNode.ROOT, level = 7, x = 63, y = 47)

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

image of result

我做错了什么?

非常感谢

【问题讨论】:

    标签: autodesk-forge


    【解决方案1】:

    定位模型有点棘手。

    在我创建的演示中,我最初使用世界坐标,将根图块设置为级别 0,并使用正确的纬度/经度坐标 utils 函数将 revit 模型定位在正确的位置。 不幸的是,精度导致了后期渲染器的渲染问题(缺少线条边缘,以及一些奇怪的 z-fighting 精度问题)...... 所以,我决定修改关卡,将地图移动到我想要的位置,并将 revit 模型置于原点 0,0,0 的中心。

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

    我建议将根图块改回零,并将模型位置 globaloffset 调整为 lat/long W84 utils 的值。请参阅博客文章以及 geo-three repo 的坐标部分,了解更多详情:https://github.com/tentone/geo-three#coordinates

    【讨论】:

    • 有没有办法用地图的一部分创建一个更小的网格?目前它每边大约有 90 英里长,这不是很实用并且影响导航。 1 英里 x 1 英里对我的项目来说已经足够了。
    【解决方案2】:

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

    1. 计算 Tile X 和 Y(您已经完成了该步骤,仅供参考):

    从您发布到https://dotnetfiddle.net/ 的链接 bing-maps-tile-system 中复制 TileSystem 类 (您还需要添加:使用 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);
    

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

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

    dH * 3400 = 147900

    dV * 3400 = 60520

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

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

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

    【讨论】:

    • 我更新了我的博文——它现在指向你的答案。谢谢杜兹马克。这太棒了!
    猜你喜欢
    • 1970-01-01
    • 2020-10-21
    • 2020-01-06
    • 2018-02-05
    • 2018-08-12
    • 2020-05-06
    • 2020-08-21
    • 2017-10-17
    • 2019-01-21
    相关资源
    最近更新 更多