Streamlit - карта быстрого обновления (фолиум/геопанда)Python

Программы на Python
Anonymous
Streamlit - карта быстрого обновления (фолиум/геопанда)

Сообщение Anonymous »

У меня есть этот код, который должен быстро обновлять координаты (широту, долготу и статус GPS-фиксации) через поток:

Код: Выделить всё

import socket
import struct
import time
import threading
import streamlit as st
import folium
from streamlit.runtime.scriptrunner import add_script_run_ctx
from streamlit_folium import st_folium

SERVER_ADDRESS = '127.0.0.1'
SERVER_PORT = 25567
LAT_LON_PRECISION = 8

STATUS_NO_FIX = -1  # unable to fix position
STATUS_FIX = 0  # unaugmented fix
STATUS_SBAS_FIX = 1  # with satellite-based augmentation
STATUS_GBAS_FIX = 2

@st.cache_resource
def getSharedData():
return {
'latitude': None,
'longitude': None,
'status': None
}

def receiveData(shared_data):
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.bind((SERVER_ADDRESS, SERVER_PORT))
while True:
data, server_address = client.recvfrom(1024)
unpacked_data = struct.unpack('ddi', data)
latitude, longitude, status = unpacked_data

shared_data['latitude'] = round(latitude, LAT_LON_PRECISION)
shared_data['longitude'] = round(longitude, LAT_LON_PRECISION)
shared_data['status'] = getStatusText(status)

@st.cache_resource
def updateData():
receive_thread = threading.Thread(target=receiveData, args=(getSharedData(),))
receive_thread.daemon = True
add_script_run_ctx(receive_thread)
receive_thread.start()

def getStatusText(status):
if status == STATUS_NO_FIX:
return "No Fix"
elif status == STATUS_FIX:
return "Fix"
elif status == STATUS_SBAS_FIX:
return "SBAS"
elif status == STATUS_GBAS_FIX:
return "GBAS"
return "N/A"

def main():
st.set_page_config(layout="wide")
updateData()

sharedData = getSharedData()

lat_display = st.empty()
lon_display = st.empty()
status_display = st.empty()
map_display = st.empty()

m = folium.Map(zoom_start=12)

while True:
latitude = sharedData['latitude']
longitude = sharedData['longitude']
status = sharedData['status']
if latitude is None or longitude is None:
time.sleep(0.075)
continue
lat_display.text(f"Latitude: {latitude}")
lon_display.text(f"Longitude: {longitude}")
status_display.text(f"Status: {status}")

folium.Marker([latitude, longitude], tooltip="Current Location").add_to(m)

with map_display:
st_folium(m)

time.sleep(0.075)

if __name__ == "__main__":
main()
Наконец-то я добился совместного использования/кэширования данных между несколькими клиентами.
Проблема, с которой я столкнулся сейчас, заключается в том, что я хочу визуализировать карту с текущим местоположением (и другими вещами в будущее). Но когда я вызываю st_folium (то же самое с geopandas и st.map()), он начинает мерцать. Как я могу быстро обновить карту? Любая карта, мне не обязательно придерживаться листа или геопанд.

Подробнее здесь: https://stackoverflow.com/questions/784 ... -geopandas

Вернуться в «Python»