將Esri的shp數(shù)據(jù)導(dǎo)入Houdini2020-11-18

工作需要經(jīng)過幾天的測試和探索蒜田,發(fā)現(xiàn)使用如下兩種方法可以將Esri的shp數(shù)據(jù)(包含點坐標,屬性等數(shù)據(jù))導(dǎo)入到Houdini捐迫,這兩種方法都是基于Python強大的庫來實現(xiàn)的

兩種方法讀取文件的思路是一樣的酵紫,都是先直接讀取為元組類型的亡鼠,再轉(zhuǎn)變?yōu)樽值溥M行循環(huán)讀取其中的數(shù)據(jù)

方法1:pyshp庫

優(yōu)點:精巧簡練旭从,安裝方便

缺點:感覺略不穩(wěn)定稳强,在Python2.7中發(fā)現(xiàn)數(shù)據(jù)有丟失,后改為使用Python3.7無異常

方法2:geopandas庫

優(yōu)點:功能全面和悦,支持修改數(shù)據(jù)

缺點:依賴較多的庫退疫,并且只能在Python3.x中使用

pyshp庫的下載與安裝:

下載地址: https://github.com/GeospatialPython/pyshp#reading-shapefile-meta-data

安裝方法:直接將shapefile文件放入Houdini的Python目錄的“l(fā)ib\site-packages”目錄下

geopandas庫的下載與安裝:

推薦使用pip安裝,如果沒有pip鸽素,需要先下載pip:

下載地址:https://pypi.org/search/?q=pip

然后使用pip安裝以下幾個庫:

numpy

pandas(version 0.13 or later)

shapely

fiona

six

geopy0.99 (optional; for geocoding)

psycopg2(optional; for PostGIS connection)
繪圖的話會用到另外的一些庫:

matplotlib

descartes

pysal

安裝和使用參考原文地址http://www.cnblogs.com/giserliu/p/4988615.html

如果在線安裝不成功褒繁,可以去這個網(wǎng)站下載后進行離線安裝https://www.lfd.uci.edu/~gohlke/pythonlibs/

接下來是這兩個庫的實現(xiàn)方法

pyshp實現(xiàn)方法

首先導(dǎo)入shapefile模塊

pyshp提供了Reader的方法讀取文件

直接讀取的內(nèi)容返回的只是一個文件包含的內(nèi)容列表,而不是具體的數(shù)據(jù)列表

print如下:

圖中的type類型可以使用shapeTypeName獲取付鹿,我當前的類型為POLYLINE澜汤,也就是純線的shp文件

接下來需要使用shapeRecords方法讀取出數(shù)據(jù)所在的內(nèi)存地址

如果要只讀取坐標信息可以使用shapes

只獲取屬性可以使用records

更多的讀取方式請參照官方文檔https://pypi.org/project/pyshp/

當前讀取出的只是內(nèi)存地址,還并未獲取到具體的數(shù)據(jù)列表

print如下:

獲取出數(shù)據(jù)列表(字典類型)可以使用geo_interface方法

print如下:

現(xiàn)在數(shù)據(jù)已經(jīng)是一個字典類型舵匾,其中prorerties是shp文件的屬性列表,geometry是shp文件的類型和點坐標信息

如果列表中的數(shù)據(jù)屬性都一樣那么只需要獲取第一個數(shù)據(jù)的屬性列表谁不,for循環(huán)內(nèi)使用addAttrib為prim添加相應(yīng)的屬性坐梯,屬性值暫為空即可

如果列表中的數(shù)據(jù)屬性不一樣,那么需要每條數(shù)據(jù)都判斷一下是否存在當前數(shù)據(jù)刹帕,如果不存在再為prim添加屬性吵血,然后賦值,賦值可以使用setAttribValue方法

導(dǎo)入shape到添加屬性:

import shapefile #導(dǎo)入shapefile模塊
import hou#導(dǎo)入hou模塊
node = hou.pwd()#當前節(jié)點
geo = node.geometry()#當前節(jié)點的模型
shape_file=hou.node("..").parm("shape_onefile").eval()#讀取了上層節(jié)點parm內(nèi)的路徑
shape=shapefile.Reader(shape_file)#讀取shape文件
shapes=shape.shapeRecords()#獲取文件內(nèi)的坐標和屬性信息
isPoly=0#判斷文件屬性是否為多邊形
if border_shape.shapeTypeName=="POLYGON":
    isPoly=1
shape0=shapes[0].__geo_interface__#將第一個shape轉(zhuǎn)換為字典
shape0Attribs=shape0["properties"]#獲取屬性列表
for shape0Attrib in shape0Attribs:#為當前節(jié)點prim添加字符串屬性偷溺,屬性值為空
    geo.addAttrib(hou.attribType.Prim, str(shape0Attrib), "")
print(shape0Attribs)

接下來就可以循環(huán)shapes里的內(nèi)容蹋辅,獲取點坐標創(chuàng)建shape了,之后再設(shè)置屬性就好了

創(chuàng)建shape和設(shè)置屬性的代碼如下(需要在shapes的循環(huán)中做):

points = geo.createPoints(myPositions)#創(chuàng)建點(myPositions是遍歷shapes過后生成的坐標數(shù)組)
poly = geo.createPolygon()#創(chuàng)建多邊形
poly.setIsClosed(isPoly) #isPoly:1為多邊形挫掏,isPoly:0為邊線
for point in points:
    poly.addVertex(point)  #創(chuàng)建vertex
geojAttribs=geoj["properties"]#geoj是當前shape的字典
for geojAttrib in geojAttribs:#設(shè)置每個屬性值
    poly.setAttribValue(str(geojAttrib), str(geojAttribs[str(geojAttrib)]) )

到此shp文件就全部導(dǎo)入成功了侦另,接下來是geopandas庫的使用方法

geopandas實現(xiàn)方法

和pyshp的原理相似,所以只寫到獲取到數(shù)據(jù)字典為止

首先導(dǎo)入geopandas模塊

然后使用read_file方法讀取shp文件
print如下:

接下來相比pyshp可以省略一步獲取點和屬性的操作,因為read_file進來的直接就是元組類型的數(shù)據(jù)了

和pyshp一樣可以使用geo_interface方法轉(zhuǎn)換為字典褒傅,轉(zhuǎn)換后字典包含type弃锐、features、bbox
其中features包含了具體的屬性和坐標信息
print features中的一個shape如下:


到此就可以循環(huán)獲取字典內(nèi)部的數(shù)據(jù)了殿托,當然geopandas模塊是很強大的霹菊,還有很多方法可以使用,官方文檔鏈接https://geopandas.org/reference.html

用到的主要代碼:

import geopandas as gpd
shape = gpd.read_file("C:\aaa.shp")#shp文件路徑
shapes = shape.__geo_interface__#轉(zhuǎn)換為字典

接下來需要設(shè)置屬性等操作就和上面pyshp的步驟一樣了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末支竹,一起剝皮案震驚了整個濱河市旋廷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌礼搁,老刑警劉巖饶碘,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異叹坦,居然都是意外死亡熊镣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門募书,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绪囱,“玉大人,你說我怎么就攤上這事莹捡」沓常” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵篮赢,是天一觀的道長齿椅。 經(jīng)常有香客問我,道長启泣,這世上最難降的妖魔是什么涣脚? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮寥茫,結(jié)果婚禮上遣蚀,老公的妹妹穿的比我還像新娘。我一直安慰自己纱耻,他們只是感情好芭梯,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弄喘,像睡著了一般玖喘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蘑志,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天累奈,我揣著相機與錄音贬派,去河邊找鬼。 笑死费尽,一個胖子當著我的面吹牛逃默,可吹牛的內(nèi)容都是我干的痹换。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驮俗!你這毒婦竟也來了逆巍?” 一聲冷哼從身側(cè)響起县貌,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抖拴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后缘缚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勾笆,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年桥滨,在試婚紗的時候發(fā)現(xiàn)自己被綠了窝爪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡齐媒,死狀恐怖蒲每,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喻括,我是刑警寧澤邀杏,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站唬血,受9級特大地震影響望蜡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拷恨,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一脖律、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腕侄,春花似錦状您、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眯分。三九已至拌汇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弊决,已是汗流浹背噪舀。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工魁淳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人与倡。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓界逛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纺座。 傳聞我的和親對象是個殘疾皇子息拜,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容