def control(self): self.ids = [] self.polynum = self.ml.featureCount() feat = QgsFeature() provider = self.ml.dataProvider() feats = provider.getFeatures() self.emit(SIGNAL("runStatus(PyQt_PyObject)"), 0) self.emit(SIGNAL("runRange(PyQt_PyObject)"), (0, self.polynum)) ne = 0 while feats.nextFeature(feat): ne += 1 self.emit(SIGNAL("runStatus(PyQt_PyObject)"), ne) geom = QgsGeometry(feat.geometry()) if geom.isMultipart(): multi_polygon = geom.asMultiPolygon() for polygon in multi_polygon: for ring in polygon: for v in ring: self.cintlen(str(v.x())) self.cintlen(str(v.y())) else: polygon = geom.asPolygon() for ring in polygon: for v in ring: self.cintlen(str(v.x())) self.cintlen(str(v.y())) self.ids.append(feat.id())
def control(self): self.ids = [] self.polynum = self.ml.featureCount() feat = QgsFeature() provider = self.ml.dataProvider() feats = provider.getFeatures() #self.emit(SIGNAL("runStatus(PyQt_PyObject)"), 0) #self.emit(SIGNAL("runRange(PyQt_PyObject)"), (0, self.polynum)) ne = 0 while feats.nextFeature(feat): ne += 1 #self.emit(SIGNAL("runStatus(PyQt_PyObject)"), ne) geom = QgsGeometry(feat.geometry()) if geom.isMultipart(): multi_polygon = geom.asMultiPolygon() for polygon in multi_polygon: for ring in polygon: for v in ring: self.cintlen(str(v.x())) self.cintlen(str(v.y())) else: polygon = geom.asPolygon() for ring in polygon: for v in ring: self.cintlen(str(v.x())) self.cintlen(str(v.y())) self.ids.append(feat.id())
def convSplus(self, prec): for i in range(0, self.polynum): j = i + 1 self.plainTextEdit.appendPlainText("%s area%s" % (j, j)) self.plainTextEdit.appendPlainText("") mod = min(self.ids) p = 1 if mod == 1: p = 0 for ne in range(mod, self.polynum + mod): pn = 1 feat = QgsFeature() geom = QgsGeometry() fiter = self.ml.getFeatures(QgsFeatureRequest(ne)) if fiter.nextFeature(feat): geom = QgsGeometry(feat.geometry()) id = feat.id() + p if geom.isMultipart(): multi_polygon = geom.asMultiPolygon() for polygon in multi_polygon: for ring in polygon: for v in ring: self.plainTextEdit.appendPlainText( "area%s %s %s" % (id, round(v.x(), prec), round(v.y(), prec))) pn += 1 self.plainTextEdit.appendPlainText("NA NA NA") else: polygon = geom.asPolygon() for ring in polygon: for v in ring: self.plainTextEdit.appendPlainText( "area%s %s %s" % (id, round(v.x(), prec), round(v.y(), prec))) pn += 1 self.plainTextEdit.appendPlainText("NA NA NA") if pn >= 10000: QMessageBox.information( self, "Too many points", "Polygon No. %s contains to many points to read into GeoBUGS.\nSimplifying of polygon can solve this problem." % (id), buttons=QMessageBox.Ok, defaultButton=QMessageBox.NoButton) self.progressBar.setValue(100 * id / self.polynum) self.plainTextEdit.appendPlainText("END")
def convSplus(self, prec): for i in range(0, self.polynum): j = i + 1 self.plainTextEdit.appendPlainText("%s area%s" % (j, j)) self.plainTextEdit.appendPlainText("") mod = min(self.ids) p = 1 if mod==1: p = 0 for ne in range(mod, self.polynum + mod): pn = 1 feat = QgsFeature() geom = QgsGeometry() fiter = self.ml.getFeatures(QgsFeatureRequest(ne)) if fiter.nextFeature(feat): geom = QgsGeometry(feat.geometry()) id = feat.id()+p if geom.isMultipart(): multi_polygon = geom.asMultiPolygon() for polygon in multi_polygon: for ring in polygon: for v in ring: self.plainTextEdit.appendPlainText( "area%s %s %s" % (id, round(v.x(), prec), round(v.y(), prec))) pn += 1 self.plainTextEdit.appendPlainText("NA NA NA") else: polygon = geom.asPolygon() for ring in polygon: for v in ring: self.plainTextEdit.appendPlainText( "area%s %s %s" % (id, round(v.x(), prec), round(v.y(), prec))) pn += 1 self.plainTextEdit.appendPlainText("NA NA NA") if pn >= 10000: QMessageBox.information(self, "Too many points", "Polygon No. %s contains to many points to read into GeoBUGS.\nSimplifying of polygon can solve this problem." % (id), buttons=QMessageBox.Ok, defaultButton=QMessageBox.NoButton) self.progressBar.setValue(100 * id / self.polynum) self.plainTextEdit.appendPlainText("END")
def getMatchingFeatures(self, geometry, contains, singleSelect): newFeatures = [] if geometry.type() != QgsWkbTypes.PolygonGeometry: return newFeatures layer = self.canvas.currentLayer() if layer is None: return newFeatures selectGeomTrans = QgsGeometry(geometry) try: ct = QgsCoordinateTransform(self.canvas.mapSettings().destinationCrs(), layer.crs(), QgsProject.instance()) if not ct.isShortCircuited() and selectGeomTrans.type() == QgsWkbTypes.PolygonGeometry: poly = selectGeomTrans.asPolygon() if len(poly) == 1 and len(poly[0]) == 5: ringIn = poly[0] ringOut = [] ringOut.append(ringIn[0]) i = 1 for j in range(1, 5): v = QgsVector((ringIn[j] - ringIn[j - 1]) / 10.0) for k in range(9): ringOut.append(ringOut[i - 1] + v) i += 1 ringOut.append(ringIn[j]) i += 1 selectGeomTrans = QgsGeometry.fromPolygonXY([ringOut]) selectGeomTrans.transform(ct) except QgsCsException as e: QgsMessageLog.logMessage("Selection extends beyond layer's coordinate system") return newFeatures context = QgsRenderContext.fromMapSettings(self.canvas.mapSettings()) context.expressionContext().appendScope(QgsExpressionContextUtils.layerScope(layer)) r = None if layer.renderer(): r = layer.renderer().clone() r.startRender(context, layer.fields()) request = QgsFeatureRequest() request.setFilterRect(selectGeomTrans.boundingBox()) request.setFlags(QgsFeatureRequest.ExactIntersect) if r: request.setSubsetOfAttributes(r.usedAttributes(context), layer.fields()) else: request.setSubsetOfAttributes([]) closestFeatureId = 0 foundSingleFeature = False closestFeatureDist = sys.float_info.max for f in layer.getFeatures(request): context.expressionContext().setFeature(f) if r and not r.willRenderFeature(f, context): continue g = f.geometry() if contains: if not selectGeomTrans.contains(g): continue else: if not selectGeomTrans.intersects(g): continue if singleSelect: foundSingleFeature = True distance = g.distance(selectGeomTrans) if distance <= closestFeatureDist: closestFeatureDist = distance closestFeatureId = f.id() else: newFeatures.append(f.id()) if singleSelect and foundSingleFeature: newFeatures.append(closestFeatureId) if r: r.stopRender(context) return newFeatures
def btnConstruct_Click(self): flag = FlightPlanBaseSimpleDlg.btnConstruct_Click(self) if not flag: return # mapUnits = define._canvas.mapUnits() constructionLayer = None if self.parametersPanel.cmbConstructionType.currentText() == "2D": constructionLayer = AcadHelper.createVectorLayer(SurfaceTypes.DmeUpdateArea) # if define._mapCrs == None: # if mapUnits == QGis.Meters: # constructionLayer = QgsVectorLayer("linestring?crs=EPSG:32633", SurfaceTypes.DmeUpdateArea, "memory") # else: # constructionLayer = QgsVectorLayer("linestring?crs=EPSG:4326", SurfaceTypes.DmeUpdateArea, "memory") # else: # constructionLayer = QgsVectorLayer("linestring?crs=%s"%define._mapCrs.authid (), SurfaceTypes.DmeUpdateArea, "memory") # shpPath = "" # if define.obstaclePath != None: # shpPath = define.obstaclePath # elif define.xmlPath != None: # shpPath = define.xmlPath # else: # shpPath = define.appPath # er = QgsVectorFileWriter.writeAsVectorFormat(constructionLayer, shpPath + "/" + QString(SurfaceTypes.DmeUpdateArea).replace(" ", "") + ".shp", "utf-8", constructionLayer.crs()) # constructionLayer = QgsVectorLayer(shpPath + "/" + QString(SurfaceTypes.DmeUpdateArea).replace(" ", "") + ".shp", SurfaceTypes.DmeUpdateArea, "ogr") point3d = self.parametersPanel.pnlDme1.Point3d point3d1 = self.parametersPanel.pnlDme2.Point3d num = MathHelper.calcDistance(point3d, point3d1) num1 = num * 0.5 num2 = math.sqrt(num * num - num1 * num1) num3 = MathHelper.getBearing(point3d, point3d1) point3d2 = MathHelper.distanceBearingPoint(point3d, num3, 0.5 * num) point3d3 = MathHelper.distanceBearingPoint(point3d2, num3 - 1.5707963267949, num2) point3d4 = MathHelper.distanceBearingPoint(point3d2, num3 + 1.5707963267949, num2) distance = Distance(float(self.parametersPanel.txtDoc1.text()), DistanceUnits.NM) metres = distance.Metres distance1 = Distance(float(self.parametersPanel.txtDoc2.text()), DistanceUnits.NM) metres1 = distance1.Metres circlePointList = MathHelper.constructCircle(point3d, metres, 100) circlePointList1 = MathHelper.constructCircle(point3d1, metres1, 100) circlePointList2 = MathHelper.constructCircle(point3d3, num, 100) circlePointList3 = MathHelper.constructCircle(point3d4, num, 100) circlePointList4 = MathHelper.constructCircle(point3d, 1900, 100) circlePointList5 = MathHelper.constructCircle(point3d1, 1900, 100) # constructionLayer.startEditing() polygon = QgsGeometry.fromPolygon([circlePointList]) # feature0 = QgsFeature() # feature0.setGeometry(polygon) # constructionLayer.addFeature(feature0) polygon = QgsGeometry.fromPolygon([circlePointList]) polygon1 = QgsGeometry.fromPolygon([circlePointList1]) polygon2 = QgsGeometry.fromPolygon([circlePointList2]) polygon3 = QgsGeometry.fromPolygon([circlePointList3]) polygon4 = QgsGeometry.fromPolygon([circlePointList4]) polygon5 = QgsGeometry.fromPolygon([circlePointList5]) polygon0 = polygon.intersection(polygon1) polygon0 = polygon0.intersection(polygon2) polygon0 = polygon0.difference(polygon3) polygon0 = polygon0.difference(polygon4) polygon0 = polygon0.difference(polygon5) pointArray = QgsGeometry.asPolygon(polygon0) # feature1 = QgsFeature() # feature1.setGeometry(QgsGeometry.fromPolyline(pointArray[0])) # constructionLayer.addFeature(feature1) AcadHelper.setGeometryAndAttributesInLayer(constructionLayer, pointArray[0]) polygon0 = polygon.intersection(polygon1) polygon0 = polygon0.intersection(polygon3) polygon0 = polygon0.difference(polygon2) polygon0 = polygon0.difference(polygon4) polygon0 = polygon0.difference(polygon5) pointArray = QgsGeometry.asPolygon(polygon0) # feature1 = QgsFeature() # feature1.setGeometry(QgsGeometry.fromPolyline(pointArray[0])) # # constructionLayer.addFeature(feature1) AcadHelper.setGeometryAndAttributesInLayer(constructionLayer, pointArray[0]) # constructionLayer.commitChanges() else: constructionLayer = AcadHelper.createVectorLayer(SurfaceTypes.DmeUpdateArea, QGis.Polygon) # if define._mapCrs == None: # if mapUnits == QGis.Meters: # constructionLayer = QgsVectorLayer("polygon?crs=EPSG:32633", SurfaceTypes.DmeUpdateArea, "memory") # else: # constructionLayer = QgsVectorLayer("polygon?crs=EPSG:4326", SurfaceTypes.DmeUpdateArea, "memory") # else: # constructionLayer = QgsVectorLayer("polygon?crs=%s"%define._mapCrs.authid (), SurfaceTypes.DmeUpdateArea, "memory") # shpPath = "" # if define.obstaclePath != None: # shpPath = define.obstaclePath # elif define.xmlPath != None: # shpPath = define.xmlPath # else: # shpPath = define.appPath # er = QgsVectorFileWriter.writeAsVectorFormat(constructionLayer, shpPath + "/" + QString(SurfaceTypes.DmeUpdateArea).replace(" ", "") + ".shp", "utf-8", constructionLayer.crs()) # constructionLayer = QgsVectorLayer(shpPath + "/" + QString(SurfaceTypes.DmeUpdateArea).replace(" ", "") + ".shp", SurfaceTypes.DmeUpdateArea, "ogr") point3d = self.parametersPanel.pnlDme1.Point3d point3d1 = self.parametersPanel.pnlDme2.Point3d num = MathHelper.calcDistance(point3d, point3d1) num1 = num * 0.5 num2 = math.sqrt(num * num - num1 * num1) num3 = MathHelper.getBearing(point3d, point3d1) point3d2 = MathHelper.distanceBearingPoint(point3d, num3, 0.5 * num) point3d3 = MathHelper.distanceBearingPoint(point3d2, num3 - 1.5707963267949, num2) point3d4 = MathHelper.distanceBearingPoint(point3d2, num3 + 1.5707963267949, num2) distance = Distance(float(self.parametersPanel.txtDoc1.text()), DistanceUnits.NM) metres = distance.Metres distance1 = Distance(float(self.parametersPanel.txtDoc2.text()), DistanceUnits.NM) metres1 = distance1.Metres circlePointList = MathHelper.constructCircle(point3d, metres, 100) circlePointList1 = MathHelper.constructCircle(point3d1, metres1, 100) circlePointList2 = MathHelper.constructCircle(point3d3, num, 100) circlePointList3 = MathHelper.constructCircle(point3d4, num, 100) circlePointList4 = MathHelper.constructCircle(point3d, 1900, 100) circlePointList5 = MathHelper.constructCircle(point3d1, 1900, 100) # constructionLayer.startEditing() polygon = QgsGeometry.fromPolygon([circlePointList]) # feature0 = QgsFeature() # feature0.setGeometry(polygon) # constructionLayer.addFeature(feature0) polygon = QgsGeometry.fromPolygon([circlePointList]) polygon1 = QgsGeometry.fromPolygon([circlePointList1]) polygon2 = QgsGeometry.fromPolygon([circlePointList2]) polygon3 = QgsGeometry.fromPolygon([circlePointList3]) polygon4 = QgsGeometry.fromPolygon([circlePointList4]) polygon5 = QgsGeometry.fromPolygon([circlePointList5]) polygon0 = polygon.intersection(polygon1) polygon0 = polygon0.intersection(polygon2) polygon0 = polygon0.difference(polygon3) polygon0 = polygon0.difference(polygon4) polygon0 = polygon0.difference(polygon5) # feature1 = QgsFeature() # feature1.setGeometry(polygon0) # constructionLayer.addFeature(feature1) AcadHelper.setGeometryAndAttributesInLayer(constructionLayer, polygon0.asPolygon()[0]) polygon0 = polygon.intersection(polygon1) polygon0 = polygon0.intersection(polygon3) polygon0 = polygon0.difference(polygon2) polygon0 = polygon0.difference(polygon4) polygon0 = polygon0.difference(polygon5) # feature2 = QgsFeature() # feature2.setGeometry(polygon0) # constructionLayer.addFeature(feature2) AcadHelper.setGeometryAndAttributesInLayer(constructionLayer, polygon0.asPolygon()[0]) # constructionLayer.commitChanges() QgisHelper.appendToCanvas(define._canvas, [constructionLayer], SurfaceTypes.DmeUpdateArea) self.resultLayerList = [constructionLayer] QgisHelper.zoomToLayers([constructionLayer])
def load_complex_gml(self, xml_uri, is_remote, attributes = {}, geometry_mapping = None, logger = None, swap_xy = False): """ :param xml_uri: the XML URI :param is_remote: True if it has to be fetched by http :param attributes: { 'attr1' : ( '//xpath/expression', QVariant.Int ) } :param geometry_mapping: XPath expression to a gml geometry node :param swap_xy: True if X/Y coordinates must be swapped :returns: the created layer """ if is_remote: xml = remote_open_from_qgis(xml_uri) else: # Open the file in binary mode, this means returning bytes # instead of a string whose encoding would have to be interpreted # it is up to the XML parser to determine which encoding it is xml = open(xml_uri, 'rb') src = ComplexFeatureSource(xml, attributes, geometry_mapping, logger) attr_list = [ (k, v[1]) for k, v in attributes.items() ] # first feature id, fid, g, xml, attrs = next(src.getFeatures()) qgsgeom = None if g is None: layer = self._create_layer('none', None, attr_list, src.title) else: wkb, srid = g qgsgeom = QgsGeometry() qgsgeom.fromWkb(wkb) if qgsgeom and qgsgeom.type() == QgsWkbTypes.PointGeometry: layer = self._create_layer('point', srid, attr_list, src.title + " (points)") elif qgsgeom and qgsgeom.type() == QgsWkbTypes.LineGeometry: layer = self._create_layer('linestring', srid, attr_list, src.title + " (lines)") elif qgsgeom and qgsgeom.type() == QgsWkbTypes.PolygonGeometry: layer = self._create_layer('polygon', srid, attr_list, src.title + " (polygons)") # add metadata self._add_properties_to_layer(layer, xml_uri, is_remote, attributes, geometry_mapping) # collect features features = [] for id, fid, g, xml, attrs in src.getFeatures(): qgsgeom = None wkb, srid = g qgsgeom = QgsGeometry() qgsgeom.fromWkb(wkb) if qgsgeom and qgsgeom.type() == QgsWkbTypes.PointGeometry: if swap_xy: p = qgsgeom.asPoint() qgsgeom = QgsGeometry.fromPoint(QgsPointXY(p[1], p[0])) elif qgsgeom and qgsgeom.type() == QgsWkbTypes.LineGeometry: if swap_xy: pl = qgsgeom.asPolyline() qgsgeom = QgsGeometry.fromPolyline([QgsPointXY(p[1],p[0]) for p in pl]) elif qgsgeom and qgsgeom.type() == QgsWkbTypes.PolygonGeometry: if swap_xy: pl = qgsgeom.asPolygon() qgsgeom = QgsGeometry.fromPolygon([[QgsPointXY(p[1],p[0]) for p in r] for r in pl]) f = QgsFeature(layer.dataProvider().fields(), id) if qgsgeom: f.setGeometry(qgsgeom) f.setAttribute("id", str(id)) f.setAttribute("fid", fid) f.setAttribute("_xml_", ET.tostring(xml).decode('utf8')) for k, v in attrs.items(): r = f.setAttribute(k, v) features.append(f) # write features if len(features) > 0: layer.dataProvider().addFeatures(features) return layer
class GeometryHighlight(QgsMapCanvasItem): _mapCanvas = None # QgsMapCanvas _geometry = None # QgsGeometry() _brush = QBrush() _pen = QPen() def __init__(self, mapCanvas, geometry, layer): super(GeometryHighlight, self).__init__(mapCanvas) self._mapCanvas = mapCanvas if not geometry or not isinstance(geometry, QgsGeometry) or geometry.isEmpty() or not geometry.isGeosValid(): return self._geometry = QgsGeometry(geometry) # Force deep copy self.setLineColor(Project.highlightLineColor()) self.setFillColor(Project.highlightFillColor()) if (layer and self._mapCanvas.mapSettings().hasCrsTransformEnabled()): ct = self._mapCanvas.mapSettings().layerTransform(layer) if ct: self._geometry.transform(ct) self.updateRect() self.update() def remove(self): self._mapCanvas.scene().removeItem(self) def setLineWidth(self, width): self._pen.setWidth(width) def setLineColor(self, color): lineColor = QColor(color) lineColor.setAlpha(255) self._pen.setColor(lineColor) def setFillColor(self, fillColor): self._brush.setColor(fillColor) self._brush.setStyle(Qt.SolidPattern) def updatePosition(self): pass # protected: def paint(self, painter, option=None, widget=None): # Override if not self._geometry: return painter.setPen(self._pen) painter.setBrush(self._brush) wkbType = self._geometry.wkbType() if wkbType == QGis.WKBPoint or wkbType == QGis.WKBPoint25D: self._paintPoint(painter, self._geometry.asPoint()) elif wkbType == QGis.WKBMultiPoint or wkbType == QGis.WKBMultiPoint25D: for point in self._geometry.asMultiPoint(): self._paintPoint(painter, point) elif wkbType == QGis.WKBLineString or wkbType == QGis.WKBLineString25D: self._paintLine(painter, self._geometry.asPolyline()) elif wkbType == QGis.WKBMultiLineString or wkbType == QGis.WKBMultiLineString25D: for line in self._geometry.asMultiPolyline(): self._paintLine(painter, line) elif wkbType == QGis.WKBPolygon or wkbType == QGis.WKBPolygon25D: self._paintPolygon(painter, self._geometry.asPolygon()) elif wkbType == QGis.WKBMultiPolygon or wkbType == QGis.WKBMultiPolygon25D: for polygon in self._geometry.asMultiPolygon(): self._paintPolygon(painter, polygon) def updateRect(self): if self._geometry: r = self._geometry.boundingBox() if r.isEmpty(): d = self._mapCanvas.extent().width() * 0.005 r.setXMinimum(r.xMinimum() - d) r.setYMinimum(r.yMinimum() - d) r.setXMaximum(r.xMaximum() + d) r.setYMaximum(r.yMaximum() + d) self.setRect(r) self.setVisible(True) else: self.setRect(QgsRectangle()) # private: def _paintPoint(self, painter, point): painter.drawEllipse(self.toCanvasCoordinates(point) - self.pos(), 2, 2) def _paintLine(self, painter, line): polyline = QPolygonF() for point in line: polyline.append(self.toCanvasCoordinates(point) - self.pos()) painter.drawPolyline(polyline) def _paintPolygon(self, painter, polygon): path = QPainterPath() for line in polygon: ring = QPolygonF() for point in line: cur = self.toCanvasCoordinates(point) - self.pos() ring.append(cur) ring.append(ring[0]) path.addPolygon(ring) painter.drawPath(path)
def smethod_0(region_0): return PolylineArea(QgsGeometry.asPolygon(region_0)[0])