工作需要經(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安裝以下幾個庫:
pandas(version 0.13 or later)
geopy0.99 (optional; for geocoding)
psycopg2(optional; for PostGIS connection)
繪圖的話會用到另外的一些庫:
安裝和使用參考原文地址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的步驟一樣了