本文整理汇总了Python中qgis.core.QgsDistanceArea.convertLengthMeasurement方法的典型用法代码示例。如果您正苦于以下问题:Python QgsDistanceArea.convertLengthMeasurement方法的具体用法?Python QgsDistanceArea.convertLengthMeasurement怎么用?Python QgsDistanceArea.convertLengthMeasurement使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类qgis.core.QgsDistanceArea
的用法示例。
在下文中一共展示了QgsDistanceArea.convertLengthMeasurement方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: testLengthMeasureAndUnits
# 需要导入模块: from qgis.core import QgsDistanceArea [as 别名]
# 或者: from qgis.core.QgsDistanceArea import convertLengthMeasurement [as 别名]
def testLengthMeasureAndUnits(self):
"""Test a variety of length measurements in different CRS and ellipsoid modes, to check that the
calculated lengths and units are always consistent
"""
da = QgsDistanceArea()
da.setSourceCrs(QgsCoordinateReferenceSystem.fromSrsId(3452), QgsProject.instance().transformContext())
da.setEllipsoid("NONE")
# We check both the measured length AND the units, in case the logic regarding
# ellipsoids and units changes in future
distance = da.measureLine(QgsPointXY(1, 1), QgsPointXY(2, 3))
units = da.lengthUnits()
print(("measured {} in {}".format(distance, QgsUnitTypes.toString(units))))
assert ((abs(distance - 2.23606797) < 0.00000001 and units == QgsUnitTypes.DistanceDegrees) or
(abs(distance - 248.52) < 0.01 and units == QgsUnitTypes.DistanceMeters))
da.setEllipsoid("WGS84")
distance = da.measureLine(QgsPointXY(1, 1), QgsPointXY(2, 3))
units = da.lengthUnits()
print(("measured {} in {}".format(distance, QgsUnitTypes.toString(units))))
# should always be in Meters
self.assertAlmostEqual(distance, 247555.57, delta=0.01)
self.assertEqual(units, QgsUnitTypes.DistanceMeters)
# test converting the resultant length
distance = da.convertLengthMeasurement(distance, QgsUnitTypes.DistanceNauticalMiles)
self.assertAlmostEqual(distance, 133.669, delta=0.01)
# now try with a source CRS which is in feet
da.setSourceCrs(QgsCoordinateReferenceSystem.fromSrsId(27469), QgsProject.instance().transformContext())
da.setEllipsoid("NONE")
# measurement should be in feet
distance = da.measureLine(QgsPointXY(1, 1), QgsPointXY(2, 3))
units = da.lengthUnits()
print(("measured {} in {}".format(distance, QgsUnitTypes.toString(units))))
self.assertAlmostEqual(distance, 2.23606797, delta=0.000001)
self.assertEqual(units, QgsUnitTypes.DistanceFeet)
# test converting the resultant length
distance = da.convertLengthMeasurement(distance, QgsUnitTypes.DistanceMeters)
self.assertAlmostEqual(distance, 0.6815, delta=0.001)
da.setEllipsoid("WGS84")
# now should be in Meters again
distance = da.measureLine(QgsPointXY(1, 1), QgsPointXY(2, 3))
units = da.lengthUnits()
print(("measured {} in {}".format(distance, QgsUnitTypes.toString(units))))
self.assertAlmostEqual(distance, 0.67953772, delta=0.000001)
self.assertEqual(units, QgsUnitTypes.DistanceMeters)
# test converting the resultant length
distance = da.convertLengthMeasurement(distance, QgsUnitTypes.DistanceFeet)
self.assertAlmostEqual(distance, 2.2294, delta=0.001)
示例2: processAlgorithm
# 需要导入模块: from qgis.core import QgsDistanceArea [as 别名]
# 或者: from qgis.core.QgsDistanceArea import convertLengthMeasurement [as 别名]
def processAlgorithm(self, parameters, context, feedback):
if parameters[self.INPUT] == parameters[self.HUBS]:
raise QgsProcessingException(
self.tr('Same layer given for both hubs and spokes'))
point_source = self.parameterAsSource(parameters, self.INPUT, context)
hub_source = self.parameterAsSource(parameters, self.HUBS, context)
fieldName = self.parameterAsString(parameters, self.FIELD, context)
units = self.UNITS[self.parameterAsEnum(parameters, self.UNIT, context)]
fields = point_source.fields()
fields.append(QgsField('HubName', QVariant.String))
fields.append(QgsField('HubDist', QVariant.Double))
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Point, point_source.sourceCrs())
index = QgsSpatialIndex(hub_source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]).setDestinationCrs(point_source.sourceCrs(), context.transformContext())))
distance = QgsDistanceArea()
distance.setSourceCrs(point_source.sourceCrs(), context.transformContext())
distance.setEllipsoid(context.project().ellipsoid())
# Scan source points, find nearest hub, and write to output file
features = point_source.getFeatures()
total = 100.0 / point_source.featureCount() if point_source.featureCount() else 0
for current, f in enumerate(features):
if feedback.isCanceled():
break
if not f.hasGeometry():
sink.addFeature(f, QgsFeatureSink.FastInsert)
continue
src = f.geometry().boundingBox().center()
neighbors = index.nearestNeighbor(src, 1)
ft = next(hub_source.getFeatures(QgsFeatureRequest().setFilterFid(neighbors[0]).setSubsetOfAttributes([fieldName], hub_source.fields()).setDestinationCrs(point_source.sourceCrs(), context.transformContext())))
closest = ft.geometry().boundingBox().center()
hubDist = distance.measureLine(src, closest)
if units != self.LAYER_UNITS:
hub_dist_in_desired_units = distance.convertLengthMeasurement(hubDist, units)
else:
hub_dist_in_desired_units = hubDist
attributes = f.attributes()
attributes.append(ft[fieldName])
attributes.append(hub_dist_in_desired_units)
feat = QgsFeature()
feat.setAttributes(attributes)
feat.setGeometry(QgsGeometry.fromPointXY(src))
sink.addFeature(feat, QgsFeatureSink.FastInsert)
feedback.setProgress(int(current * total))
return {self.OUTPUT: dest_id}
示例3: QChainageDialog
# 需要导入模块: from qgis.core import QgsDistanceArea [as 别名]
# 或者: from qgis.core.QgsDistanceArea import convertLengthMeasurement [as 别名]
class QChainageDialog(QDialog, Ui_QChainageDialog):
""" Setting up User Interface
"""
def __init__(self, iface):
self.iface = iface
QDialog.__init__(self)
self.setupUi(self)
self.setWindowTitle('QChainage')
self.currentUnits = None
self.qgisSettings = QSettings()
self.okbutton = self.buttonBox.button(QDialogButtonBox.Ok)
self.okbutton.setEnabled(False)
self.da = QgsDistanceArea()
self.UnitsComboBox.clear()
for u in [
QgsUnitTypes.DistanceMeters,
QgsUnitTypes.DistanceKilometers,
QgsUnitTypes.DistanceFeet,
QgsUnitTypes.DistanceNauticalMiles,
QgsUnitTypes.DistanceYards,
QgsUnitTypes.DistanceMiles,
QgsUnitTypes.DistanceDegrees,
QgsUnitTypes.DistanceCentimeters,
QgsUnitTypes.DistanceMillimeters,
QgsUnitTypes.DistanceUnknownUnit,
]:
self.UnitsComboBox.addItem(QgsUnitTypes.toString(u), u)
selected_layer_index = -1
counter = -1
for layer in self.iface.mapCanvas().layers():
if layer.type() == QgsMapLayer.VectorLayer and \
layer.geometryType() == QgsWkbTypes.LineGeometry:
self.loadLayer(layer)
counter += 1
if layer == self.iface.mapCanvas().currentLayer():
selected_layer_index = counter
if selected_layer_index >= 0:
self.selectLayerComboBox.setCurrentIndex(selected_layer_index)
def set_current_layer(self):
index = self.selectLayerComboBox.findData(self)
self.selectLayerComboBox.setCurrentIndex(index)
def loadLayer(self, layer):
self.selectLayerComboBox.addItem(layer.name(), layer)
def get_current_layer(self):
index = self.selectLayerComboBox.currentIndex()
return self.selectLayerComboBox.itemData(index)
def on_selectLayerComboBox_currentIndexChanged(self):
layer = self.get_current_layer()
if not layer:
return
units = layer.crs().mapUnits()
self.da.setSourceCrs(layer.crs(), QgsProject.instance().transformContext())
self.da.setEllipsoid( QgsProject.instance().ellipsoid())
self.currentUnits = self.UnitsComboBox.findData(units)
self.UnitsComboBox.setCurrentIndex(self.currentUnits)
self.layerNameLine.setText("chain_" + layer.name())
if layer.selectedFeatureCount() == 0:
self.selectAllRadioBtn.setChecked(True)
self.selectOnlyRadioBtn.setEnabled(False)
else:
self.selectOnlyRadioBtn.setChecked(True)
self.selectOnlyRadioBtn.setEnabled(True)
self.okbutton.setEnabled(True)
def on_UnitsComboBox_currentIndexChanged(self):
if self.currentUnits is None:
return
calc2 = self.da.convertLengthMeasurement(1.0, self.UnitsComboBox.currentData())
calc = self.da.convertLengthMeasurement(1.0, self.currentUnits)
self.distanceSpinBox.setValue(self.distanceSpinBox.value() / calc * calc2)
self.currentUnits = self.UnitsComboBox.currentData()
def accept(self):
layer = self.get_current_layer()
label = self.autoLabelCheckBox.isChecked()
layerout = self.layerNameLine.text()
self.UnitsComboBox.setCurrentIndex(self.UnitsComboBox.findData(layer.crs().mapUnits()))
distance = self.distanceSpinBox.value()
startpoint = self.startSpinBox.value()
endpoint = self.endSpinBox.value()
selected_only = self.selectOnlyRadioBtn.isChecked()
force = self.forceLastCheckBox.isChecked()
fo_fila = self.force_fl_CB.isChecked()
divide = self.divideSpinBox.value()
decimal = self.decimalSpinBox.value()
projection_setting_key = "Projections/defaultBehaviour"
#.........这里部分代码省略.........