本文整理汇总了Python中qgis.core.QgsGeometry.centroid方法的典型用法代码示例。如果您正苦于以下问题:Python QgsGeometry.centroid方法的具体用法?Python QgsGeometry.centroid怎么用?Python QgsGeometry.centroid使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类qgis.core.QgsGeometry
的用法示例。
在下文中一共展示了QgsGeometry.centroid方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: get_reduction_factor
# 需要导入模块: from qgis.core import QgsGeometry [as 别名]
# 或者: from qgis.core.QgsGeometry import centroid [as 别名]
def get_reduction_factor(self, layer, field):
"""Calculate the reduction factor."""
data_provider = layer.dataProvider()
meta_features = []
total_area = 0.0
total_value = 0.0
for feature in data_provider.getFeatures():
meta_feature = CartogramFeature()
geometry = QgsGeometry(feature.geometry())
area = QgsDistanceArea().measure(geometry)
total_area += area
feature_value = feature.attribute(field)
total_value += feature_value
meta_feature.area = area
meta_feature.value = feature_value
centroid = geometry.centroid()
(cx, cy) = centroid.asPoint().x(), centroid.asPoint().y()
meta_feature.center_x = cx
meta_feature.center_y = cy
meta_features.append(meta_feature)
fraction = total_area / total_value
total_size_error = 0
for meta_feature in meta_features:
polygon_value = meta_feature.value
polygon_area = meta_feature.area
if polygon_area < 0:
polygon_area = 0
# this is our 'desired' area...
desired_area = polygon_value * fraction
# calculate radius, a zero area is zero radius
radius = math.sqrt(polygon_area / math.pi)
meta_feature.radius = radius
if desired_area / math.pi > 0:
mass = math.sqrt(desired_area / math.pi) - radius
meta_feature.mass = mass
else:
meta_feature.mass = 0
size_error = max(polygon_area, desired_area) / \
min(polygon_area, desired_area)
total_size_error += size_error
average_error = total_size_error / len(meta_features)
force_reduction_factor = 1 / (average_error + 1)
return (meta_features, force_reduction_factor)
示例2: in_mask
# 需要导入模块: from qgis.core import QgsGeometry [as 别名]
# 或者: from qgis.core.QgsGeometry import centroid [as 别名]
def in_mask(self, feature, srid=None):
if feature is None: # expression overview
return False
if self.layer is None:
return False
try:
# layer is not None but destroyed ?
self.layer.id()
except:
self.reset_mask_layer()
return False
# mask layer empty due to unloaded memlayersaver plugin > no filtering
if self.layer.featureCount() == 0:
return True
mask_geom, bbox = self.mask_geometry()
geom = QgsGeometry(feature.geometry())
if not geom.isGeosValid():
geom = geom.buffer(0.0, 1)
if geom is None:
return False
if srid is not None and self.layer.crs().postgisSrid() != srid:
src_crs = QgsCoordinateReferenceSystem(srid)
dest_crs = self.layer.crs()
xform = QgsCoordinateTransform(src_crs, dest_crs, QgsProject.instance())
try:
geom.transform(xform)
except:
# transformation error. Check layer projection.
pass
if geom.type() == QgsWkbTypes.PolygonGeometry:
if self.parameters.polygon_mask_method == 2 and not self.has_point_on_surface:
self.parameters.polygon_mask_method = 1
if self.parameters.polygon_mask_method == 0:
# this method can only work when no geometry simplification is involved
return (mask_geom.overlaps(geom) or mask_geom.contains(geom))
elif self.parameters.polygon_mask_method == 1:
# the fastest method, but with possible inaccuracies
pt = geom.vertexAt(0)
return bbox.contains(QgsPointXY(pt)) and mask_geom.contains(geom.centroid())
elif self.parameters.polygon_mask_method == 2:
# will always work
pt = geom.vertexAt(0)
return bbox.contains(QgsPointXY(pt)) and mask_geom.contains(geom.pointOnSurface())
else:
return False
elif geom.type() == QgsWkbTypes.LineGeometry:
if self.parameters.line_mask_method == 0:
return mask_geom.intersects(geom)
elif self.parameters.line_mask_method == 1:
return mask_geom.contains(geom)
else:
return False
elif geom.type() == QgsWkbTypes.PointGeometry:
return mask_geom.intersects(geom)
else:
return False