<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【SU Ruby教程】幾何與變換(4):地理數(shù)據(jù)

          共 13772字,需瀏覽 28分鐘

           ·

          2021-03-07 08:34


          在了解了普遍性的空間數(shù)據(jù)表達以及微觀的空間關(guān)系判斷與變換之后,本篇作為有關(guān) Geom 模塊的最后一篇,需要介紹一種專門針對宏觀地理空間數(shù)據(jù)的表達方式。涉及了 Geom:: LatLong 和 Geom:: UTM 兩個類,分別用來表示地理坐標系的經(jīng)緯度信息和投影坐標系的水平坐標。


          這兩個類的功能是將這類地理信息換算成模型中的坐標,而這個換算過程需要當前模型已經(jīng)設(shè)置了地理信息之后才能有效使用,因此本篇在介紹兩個地理數(shù)據(jù)類之間,需要先介紹如何設(shè)置地理位置以及 SketchUp 模型如何表示地理位置。




          幾何與變換(4):地理數(shù)據(jù)



          【本期目錄】

          (1)當前模型的地理位置

          ①原點地理坐標

          ②設(shè)置地理位置的方法

          ③地理位置的存儲形式

          (3)UTM類

          何謂UTM

          Geom::UTM

          ③涉及UTM的轉(zhuǎn)換

          (2)經(jīng)緯度類

          ①Geom::LatLong

          ②坐標轉(zhuǎn)為經(jīng)緯度

          ③經(jīng)緯度轉(zhuǎn)為坐標

          (4)投影坐標系補遺

          ①投影坐標的限度

          ②赤道地區(qū)的困境

          ③自定義坐標轉(zhuǎn)換


          (1)當前模型的地理位置


          ①原點地理坐標


          SketchUp模型中關(guān)聯(lián)模型坐標和地理空間,是通過記錄原點的地理坐標實現(xiàn)的。在早期版本中還有坐標北方的設(shè)置,新版本統(tǒng)一以y軸(綠軸)正方向為北方。


          ②設(shè)置地理位置的方法


          有兩種方法設(shè)置SU模型的地理位置,一種是通過軟件界面進行設(shè)置,另一種則是直接通過ruby代碼來修改地理位置。


          (i)通過軟件界面設(shè)置


          第一步:在菜單中選擇模型信息,打開模型信息的設(shè)置窗口:

          第二步:在窗口的地理位置選項卡中選擇添加位置:

          點擊后就可以在地圖中選擇模型的范圍:

          第三步:選擇具體范圍,定位時不接受過大的影像圖片參考,不過可以在定位之后繼續(xù)添加更多影像。

          選擇確認之后,這張影像圖就會作為圖片參考以鎖定的狀態(tài)插入到模型中,作為位置參照。同時,模型信息中的位置信息也一并更新。

          另外,也可以在第二步中選擇“手動設(shè)置位置”:

          手動設(shè)置位置則不會有參考影像圖輔助定位,但是定位信息已經(jīng)儲存在當前模型中了。


          (ii)通過ruby代碼設(shè)置


          使用代碼可以直接定義坐標原點的地理信息:

          Sketchup.active_model.shadow_info["Latitude"]=26.0Sketchup.active_model.shadow_info["Longitude"]=119.0Sketchup.active_model.shadow_info["Country"]="China"Sketchup.active_model.shadow_info["City"]="Foochow"

          代碼的設(shè)置方法與“手動設(shè)置位置”的窗口設(shè)置并無不同,不過需注意經(jīng)緯度中,以東經(jīng)為正、西經(jīng)為負、北緯為正、南緯為負。國家與城市的信息不影響坐標定位。


          ③地理位置的儲存形式


          根據(jù)上文第二種設(shè)置地理位置的方法,就可以了解到 Sketchup. active_model. shadow_info 就可以訪問到當前模型的地理位置,因此這個方法返回的 Sketchup:: ShadowInfo 類實例就是可以理解為當前模型地理信息的存儲位置。


          如果將陰影設(shè)置轉(zhuǎn)為哈希類型就能看到以下內(nèi)容:

          Sketchup.active_model.shadow_info.to_h#以下為結(jié)果{ "City"=>"Foochow", "Country"=>"China", "Dark"=>45, "DayOfYear"=>183, "DaylightSavings"=>false, "DisplayNorth"=>false, "DisplayOnAllFaces"=>true, "DisplayOnGroundPlane"=>true, "DisplayShadows"=>true, "EdgesCastShadows"=>false, "Latitude"=>26.0, "Light"=>80, "Longitude"=>119.0, "NorthAngle"=>0.0, "ShadowTime"=>'2021-07-02 19:07:54 +0800', "ShadowTime_time_t"=>1625224074, "SunDirection"=>'Vector3d(0.239016, -0.0380432, 0.97027)', "SunRise"=>'2021-07-02 13:19:56 +0800', "SunRise_time_t"=>1625203196, "SunSet"=>'2021-07-03 02:55:53 +0800', "SunSet_time_t"=>1625252153, "TZOffset"=>8.0, "UseSunForAllShading"=>false}#其中單引號包含的內(nèi)容為輸出結(jié)果,不是可識別的hash格式。


          由于 Sketchup:: ShadowInfo 類最初設(shè)計的用途是作為計算陰影的依據(jù),因此大部分字段均是與陰影計算有關(guān)的設(shè)置,只不過在計算太陽高度角和日照時間時需要用到經(jīng)緯度信息,就一并記錄下來了。除了原點經(jīng)緯度坐標以外其他的設(shè)置會在之后有關(guān)文檔設(shè)置的篇幅中逐一羅列。


          除了 ShadowInfo 類以外,還有一個存儲模型坐標位置,稱為 “GeoReference”。這個設(shè)置用于記錄地理影像圖的定位。


          這個 GeoReference 選項屬于 Sketchup:: AttributeDictionary 類,其容器類為 Sketchup:: AttributeDictionaries 類,是之后圖元屬性篇的重要內(nèi)容,而在此處只需要大概了解它能夠存儲什么數(shù)據(jù)即可。


          使用與 ShadowInfo 類相似的查看方式可以看到,在不同幾種設(shè)置地理位置的方法之后,這個設(shè)置有不同的表現(xiàn)。

          Sketchup.active_model.attribute_dictionaries["GeoReference"].to_h#沒有設(shè)置定位時的結(jié)果{"GeoReferenceNorthAngle"=>0.1557307335588798, "Latitude"=>40.018309, "LocationSource"=>"Manual", "Longitude"=>-105.242139, "ModelTranslationX"=>-18871519.616960514, "ModelTranslationY"=>-174402260.58333763, "UsesGeoReferencing"=>false}#手動設(shè)置定位后的結(jié)果{"GeoReferenceNorthAngle"=>359.35706222732586, "Latitude"=>40.0, "LocationSource"=>"Manual", "Longitude"=>118.0, "ModelTranslationX"=>-23045687.47413295, "ModelTranslationY"=>-174340002.5487961, "UsesGeoReferencing"=>true}#導(dǎo)入影像圖定位后的結(jié)果{"GeoReferenceNorthAngle"=>358.7176901069756, "Latitude"=>29.597285947065465, "LocationSource"=>"Google Earth", "Longitude"=>119.59426497463414, "ModelHereState"=>"", "ModelHereZoom"=>15, "ModelTranslationX"=>-29577134.01149756, "ModelTranslationY"=>-129014701.47825345, "ModelTranslationZ"=>-2542.457294041363, "TimeStamp"=>1614759574, "UsesGeoReferencing"=>true, "ZValueCentered"=>-2542.457294041363}


          當完全沒有設(shè)置地理位置信息時: "LocationSource" 字段為 "Manual",表示沒有軟件給定的影像圖; "UsesGeoReferencing" 字段為 false,表示沒有啟用此選項的經(jīng)緯度。未啟用時, GeoReference 設(shè)置的經(jīng)緯度指向 SketchUp 在Boulder的公司地址。此時模型的地址由 ShadowInfo 確定,通常中文版的默認位置是北京故宮博物院附近。


          如果手動設(shè)置了地理信息, "UsesGeoReferencing" 字段則為 true,經(jīng)緯度信息與 ShadowInfo 一致;如果導(dǎo)入了SU提供的影像底圖, "LocationSource" 字段為會對底圖來源進行說明。


          使用軟件界面修改模型地理位置時,會同時修改 ShadowInfo 和 GeoReference 兩個設(shè)置。如果通過代碼分別修改,造成兩個設(shè)置不同時,以 ShadowInfo 的經(jīng)緯度為轉(zhuǎn)換依據(jù)。


          (2)經(jīng)緯度類


          ①Geom:: LatLong


          類似于 Point3d,  Geom 模塊定義有 LatLong 類專門儲存經(jīng)緯度信息,盡管這個類型完全可以用 [long, lat] 來替換。

          pos = Geom::LatLong.new(34.5108.5)pos.latitude#>> 34.5pos.longitude#>> 108.5puts pos#>> LatLong(34.50000北, 108.50000東)puts pos.to_utm#>> UTM(49 S 270465.57254 3820434.69231)pos.to_a#>> [34.5, 108.5]


          構(gòu)造函數(shù)同樣接受以下兩種參數(shù):

          pos1 = Geom::LatLong.new([34.5108.5])pos2 = Geom::LatLong.new(pos)


          與 Point3d 不同, LatLong 沒有諸如 .distance 這樣的方法需要調(diào)用,唯一不能用數(shù)組類型代替的是 .to_utm 方法,但是 UTM 類本身使用范圍并不廣,因此 LatLong 類的使用不像 Point3d 那樣有必要,以至于轉(zhuǎn)換坐標的方法都不將此類的實例作為可接受的參數(shù)類型。


          ②坐標轉(zhuǎn)為經(jīng)緯度


          因為模型有地理位置信息,所以坐標和經(jīng)緯度之間轉(zhuǎn)換的方法都是在Sketchup:: Model類中。

          pt=Geom::Point3d.new([0,0,0])Sketchup.active_model.point_to_latlong(pt).to_a#>> [119.00000000013267, 25.999999999986425, 0.0]


          Model 類中的 .point_to_latlong 方法需要一個 Geom:: Point3d 或 Array 類,而它的輸出結(jié)果并不是Geom:: LatLong,而是 Point3d。使用點坐標中的x作為經(jīng)度,y則作為緯度。此方法在SketchUp 6.0之前返回的確實是 Geom:: LatLong,不知出于什么目的修改成了這樣。


          如果需要返回 LatLong 類,可以自己定義一個:

          module Sketchup  class Model    def point2latlong(pt)      return Geom::LatLong.new(self.point_to_latlong(pt).to_a[0..1].reverse)    end  endend


          ③經(jīng)緯度轉(zhuǎn)為坐標


          同理,經(jīng)緯度轉(zhuǎn)為坐標也是通過 Sketchup:: Model 的方法:

          Sketchup.active_model.latlong_to_point([119.2, 29.3])#>> (13505.20874m, 366016.259858m, 0m)


          它同樣不接收 LatLong 類的實例,而是需要 [long, lat] 數(shù)組。這一點需要專門說明, LatLong 類的 .to_a 方法返回的是 [lat, long] 格式的數(shù)組,這意味著如果要使用 LatLong 類,則需要使用 .to_a .reverse 的表述。


          同樣可以自己定義一個接受 LatLong 實例的版本:

          module Sketchup  class Model    def latlong2point(latlong)      self.latlong_to_point(latlong.to_a.reverse)    end  endend


          (3)UTM類


          ①何謂UTM


          UTM,即通用橫軸墨卡托格網(wǎng)系統(tǒng)(Universal Transverse Mercartor Grid System),與國內(nèi)地形圖常用的高斯-克呂格投影都是等角橫軸圓柱投影的格網(wǎng)系統(tǒng),區(qū)別在于前者是割投影,后者是切投影。GPS 的坐標系統(tǒng)為 WGS-84,而 WGS-84 最常見的投影方式就是UTM。


          UTM將地球沿經(jīng)線劃分成60個分帶,每個分帶經(jīng)度跨度為6°。然后將分帶按照一定的投影規(guī)則投影到平面上,這個投影規(guī)則保證投影后的空間不會發(fā)生角度上的失真,因此是等角投影。

          (這里展示了投影方式,但是忽略了投影面與地球表面相割的細節(jié)。所以準確的說,這個示意圖是高斯克-呂格投影而非UTM。


          根據(jù) wiki.gis.com 中的描述,UTM的60個分度帶從緯度180°向西開始編號,180°-174°W 為1,174°W-168°W 為2,以此類推。根據(jù)緯度可以進一步將分度帶劃分成22個區(qū)域,兩極所在的分區(qū)緯度跨度為10°,其余分區(qū)高度為8°。從南緯84°到北緯84°分別用字母CX命名,中間跳過IO兩個易與數(shù)字混淆的字母。這些字母中MN之間為赤道,可以很方便的記為“N字母開始為Northern Hemisphere”。因此通過經(jīng)緯網(wǎng)可以將地表劃分成數(shù)字加字母的格網(wǎng),例如 120°E-126°E,24°N-32°N 的范圍編號為51R。特殊地,緯線圈80°以內(nèi)的圓形區(qū)域根據(jù)東西半球劃分成兩個區(qū),南極為AB區(qū),北極為YZ區(qū)。X帶的上界從 80°N 上移到 84°N 以使YZ兩個區(qū)只包含海域。高緯度地區(qū)出于更好地表現(xiàn)海陸輪廓的考慮,還有幾處例外,這里不展開。


          (圖片來源:http://wiki.gis.com/wiki/index.php/File:Utm-zones.jpg)


          不過 Sketchup 中的 UTM 似乎并不是按照這樣的規(guī)則來劃分的??傮w的分區(qū)思想不變,但是取消了X區(qū)上限北移的做法,而是刪除了Z區(qū),在 80°N-84°N 之間增加60個Y分區(qū)。同時根據(jù)海陸輪廓進行的其他例外的調(diào)整和并區(qū)的作法也沒有使用。


          除了地圖分幅,UTM 更重要的作用是經(jīng)緯度轉(zhuǎn)平面坐標,坐標以米為單位,這樣才能夠使經(jīng)緯度坐標之間能夠計算距離。一個6°分度帶上,以中央經(jīng)線和赤道的交點為實際坐標原點,但是為了使投影坐標都是正數(shù),進行原點偏移。由于赤道上3°的長度為333.96km左右,所以假定原點向西偏移500km可以保證所有橫坐標都為正數(shù)。如果是南半球的投影,則將原點繼續(xù)先南偏移10000km,這樣也可以使除了A區(qū)和B區(qū)以外的南半球所有縱坐標都為正數(shù)。極地分幅有特殊的規(guī)則,其中極點坐標為 (2000000, 2000000),也是出于同樣的理由,在這里不展開。


          ②Geom:: UTM


          所以 Geom 模塊中的 UTM 類,類似于 LatLong 類,記錄地理空間中一點的坐標。而這個點坐標有四個數(shù)據(jù),分別是帶號、格網(wǎng)圖號的字母、平面直角坐標的兩個值。


          例如以下定義了一個北半球51帶的 (500000, 0) 點,也就是該帶的實際原點,具體來說就是 123°E 0°N。

          u = Geom::UTM.new(51,"N",500000.0,0.0)puts u.zone_number  #>> 51puts u.zone_letter  #>> Nputs u.x            #>> 500000.0puts u.y            #>> 0.0puts u.to_latlong#>> LatLong(0.00000北, 123.00000東)


          構(gòu)造方法同樣接受以下兩種形式的參數(shù):

          u1 = Geom::UTM.new([51,"N",500000.0,0.0])u2 = Geom::UTM.new(u)


          其中,當 y>1000000 時,utm表示的點在南半球,這與官方文檔中的說法似乎有一些沖突:

          Note: Valid ranges for #zone_number and #zone_letter are 1-60 and C-X (omitting I and O). Valid ranges for #x and #y are 100000-899999.

          http://ruby.sketchup.com/Geom/UTM.html

          因此,如果在使用UTM類的時候發(fā)現(xiàn)一些不尋常的特性,應(yīng)當從理解UTM坐標本身入手進行方法上的修改。


          ③涉及UTM的轉(zhuǎn)換


          UTM 涉及與 LatLong 的轉(zhuǎn)換,也涉及與模型坐標的轉(zhuǎn)換。


          UTM 與 LatLong 的轉(zhuǎn)換如下:

          u = Geom::UTM.new(51,"N",500000.0,0.0)puts u.to_latlong#>> LatLong(0.00000北, 123.00000東)ll = Geom::LatLong.new(34.5108.5)puts ll.to_utm#>> UTM(49 S 270465.57254 3820434.69231)


          雖然 .to_latlong 方法主要以直角坐標和帶號為依據(jù),但并不能完全忽視 zone_letter 值錯誤時的影響。

          utm1 = Geom::UTM.new(51,"N",500000.0,0.0)utm2 = Geom::UTM.new(51,"X",500000.0,0.0)utm3 = Geom::UTM.new(51,"F",500000.0,0.0)puts utm1.to_latlongputs utm2.to_latlongputs utm3.to_latlong#>> LatLong(0.00000北, 123.00000東)#>> LatLong(0.00000北, 123.00000東)#>> LatLong(90.01823北, 123.00000東)

          因此至少要保證 zone_letter 與坐標實際表示的點在赤道同側(cè),否則就會出現(xiàn)如上 utm3 的超值錯誤。而這個錯誤來自于 to_latlong 方法需要通過 zone_letter 來確定是否需要將縱坐標還原回10000km以南,以反映南半球坐標的實際位置。南半球的坐標輸入北半球的字母代號也會有相同的問題。


          UTM 與模型點坐標的轉(zhuǎn)換同樣需要 Sketchup:: Model類:

          model = Sketchup.active_modelutm_1 = model.point_to_utm([0,0,0])#>> UTM(50 R 694820.98408 3209634.52687)puts utm_1.to_latlong#>> LatLong(29.00000北, 119.00000東)# 這是模型地理位置信息設(shè)置中的經(jīng)緯度utm_2 = model.point_to_utm([100.m,100.m,0])#>> UTM(50 R 694906.58036 3209749.83908)pt1 = utm_1.to_a[2..3]pt2 = utm_2.to_a[2..3]r=Math.sqrt((pt1[0]-pt2[0])**2+(pt1[1]-pt2[1])**2)i=Math.sqrt(100**2*2)puts r/i#>> r = 143.60929016770177#>> i = 141.4213562373095#>> 1.0154710291896851


          從例子中可以看到模型中的坐標點 [0,0,0] 和 [100.m,100.m,0] 轉(zhuǎn)為UTM坐標之后,坐標距離和實際距離相比有一些擴大。這是因為任何一種地圖投影都無法同時在平面上兼顧角度變形與面積變形。因而, UTM作為等角投影,在不同緯度上面積變形的程度是不同的。當上述例子中使用與北方成45°角的線段長度來測試變形時,這個變形就十分明顯。如果此時將模型的地理位置的緯度進行修改,最后計算出的比值就會發(fā)生改變。例如改成 119°E 1°N 時,最終的結(jié)果為0.99687。這也能體現(xiàn) UTM 是割圓柱投影,在靠近赤道的地區(qū)由于投影面在地表以下,因此投影面積要比實際面積小。如果是高斯克呂格投影,由于是切圓柱投影,面積只會擴大而不會縮小。


          因此SketchUp在處理過大的地理數(shù)據(jù)時會出現(xiàn)嚴重的形變問題,因此一定要注意模型的尺寸問題。


          可以使用 .point_to_utm 方法將模型點坐標轉(zhuǎn)換為UTM,也同樣可以通過 .utm_to_point 方法進行逆向操作:

          model = Sketchup.active_modelutm_p = Geom::UTM.new(51,"N",500000.0,0.0)point = model.utm_to_point(utm_p)#>> (-3228265233.004935mm, 445277963.173094mm, 0mm)


          (4)投影坐標系補遺


          關(guān)于投影坐標系還要再簡要補充一些內(nèi)容,關(guān)于地理坐標與模型精度的問題。


          ①投影坐標的限度


          SketchUp模型以局部建模見長,并不太適用于大面積的地理要素建模。尤其是SU的平面坐標系以UTM坐標系為基礎(chǔ),如果在較大范圍內(nèi)使用經(jīng)緯度坐標就會出現(xiàn)嚴重的形變。


          嘗試以下代碼:

          model=Sketchup.active_modelp=[]max_lng=117+3min_lng=117-3max_lat=80min_lat=0for lat in min_lat..max_lat do  p<<(min_lng..max_lng).to_a.collect{|lng|    Geom::LatLong.new(lat,lng)  }endpt=p.collect{|arr|  arr.collect{|latlong|    model.latlong_to_point(latlong.to_a.reverse)  }}for i in 0..(max_lat-min_lat) do  for j in 0..(max_lng-min_lng-1) do    model.entities.add_line(pt[i][j],pt[i][j+1])  endendfor i in 0..(max_lat-min_lat-1) do  for j in 0..(max_lng-min_lng) do    model.entities.add_line(pt[i][j],pt[i+1][j])  endend


          此代碼用于生成當前地理位置投影的經(jīng)緯網(wǎng),范圍是 114°E-120°E 0°-80°N??梢缘玫揭韵陆Y(jié)果:


          可以看到在6°范圍內(nèi),形變沒有很明顯。但是如果繼續(xù)擴大經(jīng)度范圍,使得坐標超出UTM分度帶。此時仍然可以投影坐標,但是形變程度會逐漸擴大。例如擴大到18°可以得到以下結(jié)果:


          因此,如果需要使用SketchUp制作更大尺度的三維作品,就需要自定義的投影坐標,這個會在最后提及。


          ②赤道地區(qū)的困境


          在講自定義投影規(guī)則之前,需要再補充一個和UTM坐標有關(guān)的問題。如果使用上述代碼創(chuàng)建完整的一個分度帶經(jīng)緯網(wǎng),就會導(dǎo)致一個新的錯誤:

          這是因為 .latlong_to_point 方法和 Geom:: UTM 的 .to_latlong 方法一樣,存在南半球坐標的轉(zhuǎn)換問題。如果模型的地理范圍恰巧地跨赤道兩側(cè),而又需要使用經(jīng)緯度數(shù)據(jù),這無疑是一個災(zāi)難,這時候就需要特別地將南半球坐標平移10000km,代碼如下:

          def latlong2point(latlong)  if latlong.is_a?(Array) then    lat=latlong[1]    lng=latlong[0]  elsif latlong.is_a?(Geom::LatLong) then    lat=latlong.latitude    lng=latlong.longitude  else    return(nil)  end  pt=Sketchup.active_model.latlong_to_point([lng,lat])  if lat<0 then pt[1]-=10000.km end  return ptend
          model=Sketchup.active_modelp=[]max_lng=117+3min_lng=117-3max_lat=89min_lat=-89for lat in min_lat..max_lat do p<<(min_lng..max_lng).to_a.collect{|lng| Geom::LatLong.new(lat,lng) }endpt=p.collect{|arr| arr.collect{|latlong|    latlong2point(latlong) }}for i in 0..(max_lat-min_lat) do for j in 0..(max_lng-min_lng-1) do model.entities.add_line(pt[i][j],pt[i][j+1]) endendfor i in 0..(max_lat-min_lat-1) do for j in 0..(max_lng-min_lng) do model.entities.add_line(pt[i][j],pt[i+1][j]) endend

          效果如下:



          ③自定義坐標轉(zhuǎn)換


          如果模型需要更大的空間范圍,就不能用UTM這種分帶投影了,這時如果還需要使用SketchUp,那么就需要考慮自己設(shè)置投影規(guī)則,我們可以參考 Geom:: UTM 類,創(chuàng)建一個自定義的坐標類,從而實現(xiàn)地理坐標的自定義投影。以下展示一個簡單的例子:


          暫且稱它為“Apiglio墨卡托投影”,其實就是垂直等距的繪制經(jīng)線和緯線,每個角度在投影面上的長度為1km。


          首先在 Geom 模塊中追加一個這個類的定義,就像 UTM 類一樣,有對應(yīng)的構(gòu)造函數(shù)和訪問內(nèi)部坐標的方法,也包括了轉(zhuǎn)為 LatLong 類的方法。其中的 .initialize 方法是專門用于聲明的,訪問這個方法需要使用類名+“.new”。

          module Geom  class ApiglioMercator    attr_accessor :lat, :lng    def initialize(_lat,_lng)      @lat,@lng=_lat,_lng    end    def to_a      [@lng,@lat]    end    def to_latlong      Geom::LatLong.new(@lat,@lng)    end  endend


          之后繼續(xù)在 Model 類里頭追加轉(zhuǎn)換方法。盡管這個方法并不需要讀取 Model 類的 ShadowInfo 設(shè)置,但是出于統(tǒng)一,轉(zhuǎn)為模型點坐標的方法都應(yīng)該放在這個類中:

          module Sketchup  class Model    def apigliomercator_to_point(am)      unless am.is_a?(Geom::ApiglioMercator) then return nil end      return Geom::Point3d.new(am.lng*1000.m,am.lat*1000.m,0)    end    def point_to_apigliomercator(point)      pt=Geom::Point3d.new(point)      return Geom::ApiglioMercator.new(pt[1]/1000.0.m,pt[0]/1000.0.m)    end  endend


          最后為了展示效果,這里選擇了這樣一個文件數(shù)據(jù),每一行四個浮點數(shù)分別表示邊線的起訖點經(jīng)緯度坐標:


          然后執(zhí)行以下代碼:

          filename="K:/..."#給一個具體的文件地址f=File.readlines(filename)f.collect!{|i|i.split(",")}f.collect!{|edg|edg.collect(&:to_f).each_slice(2).to_a}f.collect!{|edg|  edg.collect{|pt|    Sketchup.active_model.apigliomercator_to_point(      Geom::ApiglioMercator.new(pt[1],pt[0])    )  }}f.each{|edg|  Sketchup.active_model.entities.add_line(edg[0],edg[1])}


          執(zhí)行可能需要一些時間,執(zhí)行完成后得到以下效果:


          以上就是本篇教程的全部內(nèi)容。




          最后,如果沒有啟用 GeoReference,其經(jīng)緯度指向SketchUp的公司地址,順著經(jīng)緯度可以找到這樣的位置:


          然后對照現(xiàn)在SketchUp的東家——Trimble公司的官網(wǎng),就可以發(fā)現(xiàn)其中一個分部就位于這里:





          本文編號:SU-R09

          瀏覽 150
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91福利区| 人妻少妇无码视频免费看 | 人妻中文视频免费 | 黄色A在线观看 | 欧美性爱视频免费网站 |