但我没有看到结果,python,api,layout,gis,qgis"/>

首页 > 解决方案 > API 返回但我没有看到结果

问题描述

为了解释我的问题,我是 Python 的初学者,我必须在 Python 中做一个循环才能在 Qgis 中制作自动地图。有2个事实。首先是我正在使用法国政府的名为“地址”的 API,它从地理坐标返回地址(以及与该地址相关的许多数据)。当我在 Qgis python 控制台中运行我的代码时,响应为 200,但我没有看到任何出现。这对我来说是一个真正的问题,因为我想将这些信息导入到我的布局中,但我也不知道该怎么做(这是第二个事实)。

在这里,我向您展示了我使用 API 的代码:

for feat in mylayer.getFeatures():
Shops_name = feat['nom_sho']
x = feat['x'] #x and Y stands for longitude and latitude
y = feat['y']
x = str(x)
y = str(y)
date = datetime.date.today()
today = str(date)
expr = u"nom_sho = '{}'".format(Shops_name)
myselect = mylayer.getFeatures( QgsFeatureRequest().setFilterExpression ( expr ))
iface.mapCanvas().zoomToSelected(mylayer)
iface.mapCanvas().zoomScale(1625)
print(f"Voici {Shops_name}" )

mylayer.selectByIds( [ f.id() for f in myselect ] )

project = QgsProject.instance()
manager = project.layoutManager()
layoutName = str(Shops_name)

#layout

layouts_list = manager.printLayouts()
for layout in layouts_list:
    if layout.name() == layoutName:
        manager.removeLayout(layout)

layout = QgsPrintLayout(project)
layout.initializeDefaults()
layout.setName(layoutName)
manager.addLayout(layout)

#symbology

symbol_shop = QgsMarkerSymbol.createSimple({'name': 'Triangle', 'color': '#0088CC', 'outline_color': 'black', 'size': '4'})
symbol_shop_selected = QgsMarkerSymbol.createSimple({'name': 'Triangle', 'color': 'blue', 'outline_color': 'black', 'size': '7'})

color_shop = QgsRendererCategory(None,symbol_shop,"Other shops",True)
color_shop_selected = QgsRendererCategory(layoutName,symbol_shop_selected,layoutName,True)

renderer = QgsCategorizedSymbolRenderer("nom_sho", [color_shop,color_shop_selected])

mylayer.setRenderer(renderer)
mylayer.triggerRepaint()

# empty map 
map = QgsLayoutItemMap(layout)
map.setRect(20, 20, 20, 20)
# layout2
rectangle = QgsRectangle(1355502, -46398, 1734534, 137094)
map.setExtent(rectangle)
layout.addLayoutItem(map)

# Canva update
canvas = iface.mapCanvas()
map.setExtent(canvas.extent())
layout.addLayoutItem(map)
# Resize map
map.attemptMove(QgsLayoutPoint(5, 27, QgsUnitTypes.LayoutMillimeters))
map.attemptResize(QgsLayoutSize(220, 178, QgsUnitTypes.LayoutMillimeters))

# Legende
tree_layers = project.layerTreeRoot().children()
checked_layers = [layer.name() for layer in tree_layers if layer.isVisible()]
layers_to_remove = [layer for layer in project.mapLayers().values() if layer.name() not in checked_layers]
legend = QgsLayoutItemLegend(layout)
legend.setTitle(html.unescape("Légende"))
legend.setStyleFont(QgsLegendStyle.Title, myBoldFont)
layout.addLayoutItem(legend)
legend.attemptMove(QgsLayoutPoint(230, 24, QgsUnitTypes.LayoutMillimeters))

legend.setAutoUpdateModel(False) 
m = legend.model()
g = m.rootGroup()
for l in layers_to_remove:
    g.removeLayer(l)

g.removeLayer(osm)
legend.adjustBoxSize()

#api

r = requests.get("https://api-adresse.data.gouv.fr/reverse/?lon="+x+"&lat="+y+"")
r.json()
print(r)

# Title
title = QgsLayoutItemLabel(layout)
title.setText(layoutName)
title.setFont(myTitleBoldFont)
title.adjustSizeToText()
layout.addLayoutItem(title)
title.attemptMove(QgsLayoutPoint(5, 4, QgsUnitTypes.LayoutMillimeters))

# Subtitle
subtitle = QgsLayoutItemLabel(layout)
subtitle.setFont(QFont("Verdana", 18))
subtitle.adjustSizeToText()
layout.addLayoutItem(subtitle)
subtitle.attemptMove(QgsLayoutPoint(5, 18, QgsUnitTypes.LayoutMillimeters))

# Scale
scalebar = QgsLayoutItemScaleBar(layout)
scalebar.setStyle('Single Box')
scalebar.setUnits(QgsUnitTypes.DistanceMeters)
scalebar.setNumberOfSegments(2)
scalebar.setNumberOfSegmentsLeft(0)
scalebar.setUnitsPerSegment(25)
scalebar.setLinkedMap(map)
scalebar.setUnitLabel('km')
scalebar.setFont(QFont('Verdana', 20))
scalebar.update()
layout.addLayoutItem(scalebar)
scalebar.attemptMove(QgsLayoutPoint(10, 185, QgsUnitTypes.LayoutMillimeters))

谢谢您的帮助。

标签: pythonapilayoutgisqgis

解决方案


这是有关获取请求响应的良好信息来源。 https://www.w3schools.com/python/ref_requests_response.asp

您想要做的是获取响应的正文。您可能想要使用 r.json()。


推荐阅读