2016-06-30 70 views
2

我有一個位於地理位置的Sketchup 3d模型。我可以得到該模型的地理位置,如下所示: -無法使用Sketchup Ruby API獲取Sketchup模型的位置綁定

latitude = Sketchup.active_model.attribute_dictionaries["GeoReference"]["Latitude"] 

longitude = Sketchup.active_model.attribute_dictionaries["GeoReference"]["Longitude"] 

現在我想要在3D地球上渲染此模型。所以我需要3D模型的位置範圍。

基本上我需要在2D地圖上模型的邊界框。

現在我正在從模型的角落(8角)提取相同的東西。

// This will return left-front-bottom corner. 
lowerCorner = Sketchup.active_model.bounds.corner(0) 
// This will return right-back-top corner. 
upperCorner = Skectup.active_model.bounds.corner(6) 

但它返回以米,英寸爲單位的簡單幾何點,具體取決於型號。

例如我上傳this模型在sketchup中。以下是地理位置,lowerCornerupperCorner的值分別是我通過使用上述代碼爲上述模型得到的值。

geoLocation : 25.141407985864, 55.18563969191 //lat,long 
lowerCorner : (-9483.01089", -6412.376053", -162.609524") // In inches 
upperCorner : (-9483.01089", 6479.387909", 12882.651999") // In inches 

所以我的第一個問題是我在做什麼是正確的或不是? 第二個問題是如果是的爲第一我怎麼能得到lowerCorner和upperCorner以lat格式的值。

回答

1

但它返回以米,英寸爲單位的簡單幾何點,具體取決於型號。

Geom::BoundingBox.corner返回一個Geom::Point3d。 x,y和z成員是Length。這總是返回英寸的SketchUp的內部值。

但是,當您使用Length.to_s時,它將使用當前模型的單位設置並將值格式化爲該值。當您致電Geom::Point3d.to_s時,它將使用Length.to_s。另一方面,如果您撥打Geom::Point3d.inspect,它將打印內部單位(英寸)而不進行格式化。

相反攻到模型的直接像我建議你使用地理位置API方法的屬性:Sketchup::Model.georeferenced?

通過它的聲音,你可能會發現Sketchup::Model.point_to_latlong有用。

實施例 - I的地理定位SketchUp模型到的Trondheim, Norway城市廣場(地理定位:63°25′47″N 10°23′36″E):

model = Sketchup.active_model 
bounds = model.bounds 
# Get the base of the boundingbox. No need to get the top - as the 
# result doesn't contain altiture information. 
(0..3).each { |i| 
    pt = bounds.corner(i) 
    latlong = model.point_to_latlong(pt) 
    latitude = latlong.x.to_f 
    longitude = latlong.y.to_f 
    puts "#{pt.inspect} => #{longitude}, #{latitude}" 
} 

showing a localised su model getting world coordinates from model coordinates