映射到 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:
LatLongToPixelXY(纬度, 经度, 7, out pixelX, out pixelY);
PixelXYToTileXY(pixelX, pixelY, out tileX, out tileY);
结果pixelX = 16225, pixelY = 12249, tileX = 63, tileY = 47.
我替换之前的值:
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
找到调整地图的技巧。它仍然是手动的,但相当快:
- 计算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。
- 计算位置
在 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);
现在还不完美,但已经足够接近手动完成调整值了。
尝试按照步骤进行操作 https://forge.autodesk.com/blog/add-mapbox-google-maps-forge-viewer,但我无法将模型正确放置在地图上。
我是运行这里列出的函数:https://docs.microsoft.com/en-us/bingmaps/articles/bing-maps-tile-system:
LatLongToPixelXY(纬度, 经度, 7, out pixelX, out pixelY);
PixelXYToTileXY(pixelX, pixelY, out tileX, out tileY);
结果pixelX = 16225, pixelY = 12249, tileX = 63, tileY = 47.
我替换之前的值:
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
找到调整地图的技巧。它仍然是手动的,但相当快:
- 计算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。
- 计算位置
在 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);
现在还不完美,但已经足够接近手动完成调整值了。