def prepareExportPoint(self, pointLayer, polygon, contour): ringq = 0 csvdata = u'' for ring in polygon: for pt in ring: for pointfeature in pointLayer.getFeatures(): if pointfeature.geometry().equals(QgsGeometry.fromPoint(QgsPoint(pt.x(), pt.y()))): fullname = unicode(pointfeature.attribute(u'name')) if fullname[0] == u'н': name = fullname[1:]+u';' prefix = u'Н;' else: name = fullname + u';' prefix = u';' x = round(QgsGeometry.fromPoint(pt).asPoint().y(), 2) sx = unicode('{:.2f}'.format(x))+u';' y = round(QgsGeometry.fromPoint(pt).asPoint().x(), 2) sy = unicode('{:.2f}'.format(y))+u';' pref = unicode(pointfeature.attribute(u'prec'))+u';' hold = unicode(pointfeature.attribute(u'hold')) if ringq > 0: cnt = u'['+unicode(str(contour))+u'.'+unicode(str(ringq))+u'];' else: cnt = u'['+unicode(str(contour))+u'];' csvdata += cnt+prefix+name+u';;'+sx+sy+u';;;'+pref+hold+u'\n' if len(polygon) >= ringq+2: csvdata +=u';;;;;;;;;;;\n' ringq += 1 return csvdata
def getPoint(self, mapPoint): self.set_rad.setEnabled(True) # change tool so you don't get more than one POI self.canvas.unsetMapTool(self.emitPoint) self.canvas.setMapTool(self.userTool) # Get the click if mapPoint: self.atk_pt = QgsPoint(mapPoint) self.distance() # Specify the geometry type layer = QgsVectorLayer('Point?crs=epsg:28992', 'Attack Point', 'memory') style = "style_attack.qml" qml_path = self.plugin_dir + "/data/" + style layer.loadNamedStyle(qml_path) layer.triggerRepaint() # Set the provider to accept the data source prov = layer.dataProvider() # Add a new feature and assign the geometry feat = QgsFeature() feat.setGeometry(QgsGeometry.fromPoint(mapPoint)) prov.addFeatures([feat]) # Update extent of the layer layer.updateExtents() # Add the layer to the Layers panel QgsMapLayerRegistry.instance().addMapLayers([layer])
def addPlaceMark(self, pos, name, description, category, timestamp): ''' adds a point to the layer :param pos: lat/lon position of the placemark :type pos: QgsPoint :param name: name of the placemark :type name: string :param description: extended text for the placemark :type description: string :param category: category to define the :type category: string :param timestamp: creation time of the placemark :type timestamp: string ''' if self.hasLayer: feat = QgsFeature(self.layer.pendingFields()) feat.setAttribute('name', name) feat.setAttribute('description', description) feat.setAttribute('class', category) feat.setAttribute('timestamp', timestamp) feat.setGeometry(QgsGeometry.fromPoint(pos)) (res, _) = self.layer.dataProvider().addFeatures([feat]) if res: self.layer.updateExtents() return res return False
def createABasicPointFeature(point, attrs): feature = QgsFeature() feature.initAttributes(len(attrs)) for (index, attr) in enumerate(attrs): feature.setAttribute(index, attr) geom = QgsGeometry.fromPoint(point) feature.setGeometry(geom) return feature
def createASiteFeature(point, attrs): feature = QgsFeature() feature.initAttributes(len(attrs) + 1) for (index, attr) in enumerate(attrs): feature.setAttribute(index + 1, attr) # 如果是小区要素,id为(RNC-BSC_SiteId_CellId) feature.setAttribute(0, str(uuid4()).replace('-', '')) geom = QgsGeometry.fromPoint(point) feature.setGeometry(geom) return feature
def doCatalogMapPlan(self): pointLayer = self.getLayerByName(u'Точки') file_name = QFileDialog.getSaveFileName(None, u'Сохраните ведомость координат для карта(план)', self.lastDir, u'HTML файлы(*.html *.HTML)') if not file_name == u'': htmldata_start = u'<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=windows-1251"><meta name=ProgId content=Word.Document><meta name=Generator content="Microsoft Word 15"><meta name=Originator content="Microsoft Word 15"></head><body lang=RU link=blue vlink=purple style=\'tab-interval:35.4pt\'><table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0 width=718 style=\'width:19.0cm;margin-left:-1.7pt;border-collapse:collapse;border:none; mso-border-alt:solid windowtext .5pt;mso-yfti-tbllook:1184;mso-padding-alt: 0cm 5.4pt 0cm 5.4pt\'>' htmldata_row = u'<tr style=\'mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes\'> <td width=85 style=\'width:63.8pt;border:solid windowtext 1.0pt;mso-border-alt: solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt\'> <p class=MsoNormal style=\'mso-margin-top-alt:auto;mso-margin-bottom-alt:auto\'><span style=\'font-size:10.0pt;color:black\'>{0}<o:p></o:p></span></p> </td> <td width=113 valign=top style=\'width:3.0cm;border:solid windowtext 1.0pt; border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt: solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt\'> <p class=MsoNormal align=center style=\'mso-margin-top-alt:auto;mso-margin-bottom-alt: auto;text-align:center\'><span style=\'font-size:10.0pt\'>{1}<o:p></o:p></span></p> </td> <td width=113 valign=top style=\'width:3.0cm;border:solid windowtext 1.0pt; border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt: solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt\'> <p class=MsoNormal align=center style=\'mso-margin-top-alt:auto;mso-margin-bottom-alt: auto;text-align:center\'><span style=\'font-size:10.0pt\'>{2}<o:p></o:p></span></p></td> <td width=227 valign=top style=\'width:6.0cm;border:solid windowtext 1.0pt; border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt: solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt\'> <p class=MsoNormal align=center style=\'mso-margin-top-alt:auto;mso-margin-bottom-alt: auto;text-align:center\'><span style=\'font-size:10.0pt;color:black\'>{4}<o:p></o:p></span></p></td> <td width=180 valign=top style=\'width:134.65pt;border:solid windowtext 1.0pt; border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt: solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt\'> <p class=MsoNormal align=centerstyle=\'mso-margin-top-alt:auto;mso-margin-bottom-alt: auto;text-align:center\'><b style=\'mso-bidi-font-weight:normal\'><sub><span style=\'font-size:10.0pt\'>{3}</span></sub></b><spanstyle=\'font-size:10.0pt\'><o:p></o:p></span></p> </td> </tr>' htmldata_end = u'</table></body></html>' exportData = htmldata_start for feat in self.iface.mapCanvas().currentLayer().selectedFeatures(): polygone = feat.geometry().asPolygon() ringq = 0 for ring in polygone: for pt in ring: for pointfeature in pointLayer.getFeatures(): if pointfeature.geometry().equals(QgsGeometry.fromPoint(QgsPoint(pt.x(), pt.y()))): fullname = unicode(pointfeature.attribute(u'name')) # if fullname[0] == u'н': # name = fullname[1:]+u';' # prefix = u'н;' # else: # name = fullname + u';' # prefix = u';' x = round(QgsGeometry.fromPoint(pt).asPoint().y(), 2) sx = unicode('{:.2f}'.format(x)) y = round(QgsGeometry.fromPoint(pt).asPoint().x(), 2) sy = unicode('{:.2f}'.format(y)) exportData += htmldata_row.format(fullname, sx, sy, u'–––––––', u'картометрический') # pref = unicode(pointfeature.attribute(u'prec'))+u';' # hold = unicode(pointfeature.attribute(u'hold')) if len(polygone) >= ringq+2: exportData += htmldata_row.format(u'', u'', u'', u'', u'') ringq += 1 exportData += htmldata_end try: ccf = open(file_name, 'w') # + u'.csv' ccf.write(exportData.encode('cp1251')) except Exception as err: print err finally: ccf.close()
def create_point(self, p1, name): layer = QgsVectorLayer('Point?crs=%s' % int(self.crs), name, "memory") mycrs = QgsCoordinateReferenceSystem(int(self.crs), 0) self.reprojectgeographic = QgsCoordinateTransform( self.iface.mapCanvas().mapRenderer().destinationCrs(), mycrs) pr = layer.dataProvider() point = QgsFeature() point.setGeometry( QgsGeometry.fromPoint(self.reprojectgeographic.transform(p1))) pr.addFeatures([point]) #layer.setCrs(QgsCoordinateReferenceSystem(int(self.crs), 0)) layer.updateExtents() QgsMapLayerRegistry.instance().addMapLayer(layer) return p1
def plotar(self): vl = QgsVectorLayer("Point", "temporary_points", "memory") pr = vl.dataProvider() # Enter editing mode vl.startEditing() # add fields pr.addAttributes([ QgsField("estaca", QVariant.String), QgsField("descrição", QVariant.String), QgsField("north", QVariant.String), QgsField("este", QVariant.String), QgsField("cota", QVariant.String), QgsField("azimite", QVariant.String) ]) fets = [] for r in range(self.tableWidget.rowCount()): ident = self.tableWidget.item(r, 0).text() if ident in ["", None]: break fet = QgsFeature(vl.pendingFields()) n = 0.0 e = 0.0 try: es = self.tableWidget.item(r, 0).text() d = self.tableWidget.item(r, 1).text() n = float(self.tableWidget.item(r, 3).text()) e = float(self.tableWidget.item(r, 4).text()) c = float(self.tableWidget.item(r, 5).text()) a = self.tableWidget.item(r, 6).text() except: break fet.setGeometry(QgsGeometry.fromPoint(QgsPoint(e, n))) fet.setAttributes([es, d, n, e, c, a]) fets.append(fet) pr.addFeatures(fets) vl.commitChanges() QgsMapLayerRegistry.instance().addMapLayer(vl)
def addPoint(self, ref, attrs): refLen = len(ref) if refLen > 3: code = ref[0:2].upper() #print code e = self.east[code] n = self.north[code] #print "East: ", e, " North: ", n # Should now have the northings and eastings values... now need to add some more precision metres = ref[2:] l = len(metres) # print l if l & 0x1: # bad news, shouldn't have an odd number of digits... bomb out! self.badGridError() return 1 else: # Good news so far... even number of digits... split 'em in half and pad with zeroes l /= 2 eMetres = metres[0:l] while len(eMetres) < 5: eMetres = eMetres + "0" nMetres = metres[l:] while len(nMetres) < 5: nMetres = nMetres + "0" # Add the metres onto the eastings and northings e += eMetres n += nMetres # print e # print n # Great... now have out coordinates in QGIS acceptable format... add a new point # Get active layer layer = qgis.utils.iface.activeLayer() caps = layer.dataProvider().capabilities() if caps: # Declare a feature feat = QgsFeature() # Add attributes if len(attrs) > 0: # Just use comma delimited attList attList = attrs.split(",") # print attList feat.setAttributes(attList) # Add the points feat.setGeometry(QgsGeometry.fromPoint(QgsPoint(int(e), int(n)))) res, outFeats = layer.dataProvider().addFeatures([feat]) if not res: qgis.utils.iface.messageBar().pushMessage("Error", "An error occurred adding points", level=QgsMessageBar.CRITICAL) self.stayOpen = False return 1 # Must update the UI for user to enjoy the new points layer.triggerRepaint() else: self.badGridError() else: self.badGridError() return 1 # Must be OK return 0
def createPart(self, layer, ring): c = len(ring) curr = 1 pointLayer = self.getLayerByName(u'Точки') if pointLayer is None: idx = -1 else: idx = pointLayer.fieldNameIndex('name') cadastreLayer = self.getLayerByName(u'Кадастр') for point in ring: if curr < c: point1 = point point2 = ring[curr] isEqual = False pt1stst = False pt2stst = False curr += 1 #print point1, point2 line_geometry=QgsGeometry.fromPolyline([QgsPoint(point1.x(), point1.y()), QgsPoint(point2.x(), point2.y())]) # find point for pointfeature in pointLayer.getFeatures(): if pointfeature.geometry().equals(QgsGeometry.fromPoint(QgsPoint(point1.x(), point1.y()))): name = unicode(pointfeature.attribute(u'name')) if name[0] == u'н': pt1stst = True if pointfeature.geometry().equals(QgsGeometry.fromPoint(QgsPoint(point2.x(), point2.y()))): name = unicode(pointfeature.attribute(u'name')) if name[0] == u'н': pt2stst = True # check for identity features = layer.getFeatures() for f in features: if line_geometry.equals(f.geometry()): self.iface.messageBar().pushMessage(u'Найдена дублирующая часть границы, пропущена', level=QgsMessageBar.INFO) isEqual = True break #check for cadastre if not pt1stst and not pt2stst: findInCadastre = False print 'cadastre check' if cadastreLayer is not None and not findInCadastre: cadObjs = cadastreLayer.getFeatures() for cadObj in cadObjs: #print 'cadastre check iteration' if cadObj.geometry().isMultipart(): for cpoly in cadObj.geometry().asMultiPolygon(): if not findInCadastre: for cring in cpoly: cadCurr = 1 if not findInCadastre: cc = len(cring) for cpoint in cring: if cadCurr < cc: cpoint1 = cpoint cpoint2 = cring[cadCurr] cadCurr += 1 cadLine=QgsGeometry.fromPolyline([QgsPoint(cpoint1.x(), cpoint1.y()), QgsPoint(cpoint2.x(), cpoint2.y())]) #print 'checking line' if line_geometry.within(cadLine.buffer(0.000001, 16)): print 'find in cadastre' findInCadastre = True break else: findInCadastre = False else: if not findInCadastre: for cring in cadObj.geometry().asPolygon(): cadCurr = 1 if not findInCadastre: cc = len(cring) for cpoint in cring: if cadCurr < cc: cpoint1 = cpoint cpoint2 = cring[cadCurr] cadCurr += 1 cadLine=QgsGeometry.fromPolyline([QgsPoint(cpoint1.x(), cpoint1.y()), QgsPoint(cpoint2.x(), cpoint2.y())]) #print 'checking line' if line_geometry.within(cadLine.buffer(0.000001, 16)): print 'finded in cadastre' findInCadastre = True break else: findInCadastre = False if not findInCadastre: pt2stst = True if not isEqual: feat = QgsFeature() feat.setGeometry(line_geometry) typeidx = layer.fieldNameIndex('type') feat.initAttributes(2) if pt1stst or pt2stst: feat.setAttribute(typeidx, 2) else: feat.setAttribute(typeidx, 0) layer.dataProvider().addFeatures([feat])
def create_point(self, geometry): # add point to the layer self.seg = QgsFeature() self.seg.setGeometry(QgsGeometry.fromPoint(geometry)) self.pr.addFeatures([self.seg]) self.layer.updateExtents()