ホーム » Python (ページ 3)
「Python」カテゴリーアーカイブ
Python iniファイル読み込み
Pythonではモジュールconfigparserを使用してiniファイルを読み込む
iniファイルの文字コードはShift-JIS((CP932)
以下のコードで基本的には読み込める
但し値に日本語があるとエラーが発生するので
[code]
import configparser
config = configparser.ConfigParser()
config.read(INIファイルのパス)
sections = config[section]
val = sections.get(key)
[/code]
文字コードを指定するとエラーを回避
[code]
import configparser
config = configparser.ConfigParser()
config.read(INIファイルのパス, ‘cp932’)
sections = config[section]
val = sections.get(key)
[/code]
Polygon Featureを登録
最初にQgsGeometryを作成
[code]
points = []
point1=QgsPoint()
point1.setX(-31446.8)
point1.setY(-51366.4)
points.append(point1)
point2=QgsPoint()
point2.setX(-31446.8)
point2.setY(-50366.4)
points.append(point2)
point3=QgsPoint()
point3.setX(-30446.8)
point3.setY(-50366.4)
points.append(point3)
point4=QgsPoint()
point4.setX(-31446.8)
point4.setY(-51366.4)
points.append(point4)
line = QgsLineString()
line.setPoints(points)
poly = QgsPolygon()
poly.setExteriorRing(line)
geom = QgsGeometry(poly)
[/code]
QgsGeometryをWKTから作成する時は
[code]
geom = QgsGeometry.fromWkt(‘Polygon ((-31446.7999999999992724 -51366.40000000000145519, -31446.7999999999992724 -50366.40000000000145519, -30446.7999999999992724 -50366.40000000000145519, -31446.7999999999992724 -51366.40000000000145519))’)
[/code]
Featureを作成
[code]
features = []
feature = QgsFeature(l.fields())
feature.setAttribute(0, ‘HELLO100’)
feature.setAttribute(1, 2)
feature.setGeometry(geom)
features.append(feature)
iface.activeLayer().dataProvider().addFeatures(features)
iface.activeLayer().triggerRepaint()
[/code]
2019/01/15 修正
iface.activeLayer().addFeatures([feature])
を
iface.activeLayer().dataProvider().addFeatures(features)
に修正

カテゴリシンボルの設定
最初にカテゴリシンボルの対象となる項目「myint」を持つメモリレイヤを追加
[code]
layer=QgsVectorLayer(‘polygon?crs=epsg:2451′,’mypolygon’,’memory’)
layer.dataProvider().addAttributes([QgsField("myint", QVariant.Int)])
layer.updateFields()
QgsProject.instance().addMapLayer(layer)
[/code]
次にカテゴリ項目の設定
[code]
cats=[]
# 項目値=1の時のシンボル
val1 = 1
symbol1 = QgsFillSymbol.createSimple({‘color’: ‘0,0,255,255’,’outline_color’: ‘0,0,255,255’})
label1 = ‘label1’
cat1 = QgsRendererCategory(val1, symbol1 , label1 )
cats.append(cat1)
# 項目値=2の時のシンボル
val2 = 2
symbol2 = QgsFillSymbol.createSimple({‘color’: ‘255,0,0,255’,’outline_color’: ‘255,0,0,255’})
label2 = ‘label2’
cat2 = QgsRendererCategory(val2, symbol2 , label2 )
cats.append(cat2)
renderer=QgsCategorizedSymbolRenderer(‘myint’, cats)
layer.setRenderer(renderer)
[/code]

ポリゴンレイヤのシンボル設定
ポリゴンレイヤのシンボルの設定
ラインの色を赤に内部を透明に設定
[code]
symbol = QgsFillSymbol.createSimple({‘color’: ‘0,0,0,0’,’outline_color’: ‘255,0,0,255’})
iface.activeLayer().renderer().setSymbol(symbol)
iface.activeLayer().triggerRepaint()
[/code]

レイヤのCRSを設定
投影情報を持たないShapeファイルを読み込むと投影情報の確認ダイアログが表示される
これはオプションで新しいレイヤの投影座標系に「CRSダイアログを表示」が指定されているため

これを「プロジェクトのCRSを使用する」に変更するためにはQSettingで設定
[code]
QSettings().setValue( "/Projections/defaultBehavior", "useProject" )
[/code]
※オプション画面のuiはqgsoptionbase.ui

プロジェクトのCRSを設定
[code]
from qgis.core import QgsProject
crs = QgsCoordinateReferenceSystem("EPSG:2541")
prj = QgsProject.instance()
prj.setCrs(crs)
[/code]
設定した投影がステータスバーに反映される

設定した内容を確認
[code]
print("CRS Description: {}".format(crs.description()))
CRS Description: JGD2000 / Japan Plane Rectangular CS IX
[/code]
Shapeファイルを開く時にCRSを指定できませんでした
投影情報を持っていないShapeファイルを開くと投影を選択する画面が表示される
[code]
layer = QgsVectorLayer(‘c:\work\A27-16_13.shp’, ‘scool’, ‘ogr’)
[/code]

これを回避するためにQgsVectorLayerの最初の引数をuri形式にして同時にCRSを指定しようとしたが、
[code]
layer = QgsVectorLayer(‘file:///c:/work/A27-16_13.shp?crs=EPSG:4326’, ‘scool’, ‘ogr’)[code]
[/code]
エラーが発生したために一旦あきらめ
[code]
2018-11-27T11:31:35 WARNING Pythonのエラー : Pythonコードの実行中にエラーが発生しました: 詳細についてはメッセージログ(Pythonエラー)を参照して下さい.
[/code]
レイヤ情報を照会
アクティブなレイヤを照会
[code]
layer = self.iface.activeLayer()
[/code]
レイヤの種別
[code]
layer_type = layer.type()
if(layer_type == QgsMapLayer.VectorLayer):
[/code]
レイヤが編集可能か?
[code]
is_edit = layer.isEditable()
[/code]
一時的にレイヤ上にポイント追加
QGsMapToolのcanvasReleaseEventイベントで実行
[code]
def canvasReleaseEvent(self, e):
marker = QgsVertexMarker(self.canvas())
trans = self.canvas().getCoordinateTransform()
p = trans.toMapCoordinates(e.pos().x(), e.pos().y())
marker.setCenter(p)
marker.setColor(QColor(255, 0, 0))
marker.setIconType(QgsVertexMarker.ICON_CIRCLE)
marker.setIconSize(20)
marker.setPenWidth(5)
[/code]
marker.hide()で非表示
marker.show()で表示

レイヤにポイントを追加
[code]
layer = self.iface.activeLayer()
layer.startEditing()
feature = QgsFeature()
geom = QgsGeometry.fromPointXY(QgsPointXY(135,40))
feature.setGeometry(geom)
layer.addFeature(feature)
layer.commitChanges()
layer.updateExtents()
[/code]
layer.commitChanges()をしないと表示に反映されない?
