geospatial / app.py
blitzkrieg0000's picture
Update app.py
eaf3824 verified
Raw History Blame Contribute Delete
6.98 kB
import json
import html
import folium
import gradio as gr
from folium import plugins
from lib import RequestFunction
def CreateMap() -> folium.Map:
"""Çizim araçları ve çoklu temel katmanlar içeren ana haritayı oluşturur."""
fmap = folium.Map(location=[37.511905, 38.51532], zoom_start=6, world_copy_jump=True, tiles=None)
# Temel katmanlar
folium.TileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", attr="OpenStreetMap", name="OpenStreetMap").add_to(fmap)
folium.TileLayer("http://www.google.cn/maps/vt?lyrs=s@189&gl=cn&x={x}&y={y}&z={z}", attr="Google", name="Google Uydu").add_to(fmap)
folium.TileLayer(
"https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}", attr="Esri", name="Esri Dünya Uydu"
).add_to(fmap)
folium.TileLayer(
"https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}",
attr="Esri",
name="Esri Dünya Sokak",
).add_to(fmap)
folium.TileLayer(
"https://cartodb-basemaps-a.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png", attr="CartoDB", name="CartoDB Açık"
).add_to(fmap)
# Koordinat göstergesi
formatter = "function(num) {return L.Util.formatNum(num, 5) + ' ° ';};"
plugins.MousePosition(
position="bottomright", separator=" | ", lng_first=True, prefix="Konum:", lat_formatter=formatter, lng_formatter=formatter
).add_to(fmap)
plugins.Geocoder(position="topleft").add_to(fmap)
plugins.Draw(export=True, filename="drawing.geojson", position="topleft", show_geometry_on_click=False).add_to(fmap)
plugins.Fullscreen(position="topright").add_to(fmap)
folium.LayerControl(position="bottomleft").add_to(fmap)
# Çizim olaylarını Gradio bileşenlerine bağla
map_name = fmap.get_name()
fmap.get_root().html.add_child(
folium.Element(
f"""
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {{
var idx = 0;
var drawnItems = new L.FeatureGroup();
{map_name}.addLayer(drawnItems);
const updateGeoJsonOutput = (geoJsonData) => {{
const textArea = parent.document.querySelector('#geojson_output textarea');
if (!textArea) return;
textArea.value = JSON.stringify(geoJsonData);
textArea.dispatchEvent(new Event('input'));
}};
// "GeoJSON Al" butonuna tıklandığında güncel veriyi aktar
const processBtn = parent.document.getElementById('geojson_process');
if (processBtn) {{
processBtn.onclick = function() {{
updateGeoJsonOutput(drawnItems.toGeoJSON());
}};
}}
{map_name}.on('draw:created', function(e) {{
var layer = e.layer;
var title, value;
do {{
title = prompt('Şekle bir isim giriniz:', '');
if (title === null) return;
}} while (!title.trim());
do {{
value = prompt('Şekle bir değer giriniz:', '');
if (value === null) return;
}} while (!value.trim());
var id = idx++;
var feature = layer.feature = layer.feature || {{}};
feature.type = 'Feature';
var props = feature.properties = feature.properties || {{}};
props.Id = id;
props.Title = title;
props.Value = value;
layer.bindTooltip(
`Şekil: ${{id + 1}} | İsim: ${{title}} | Değer: ${{value}}`,
{{ permanent: false, direction: 'center', className: 'label-tooltip' }}
);
drawnItems.addLayer(layer);
updateGeoJsonOutput(drawnItems.toGeoJSON());
}});
{map_name}.on('draw:deleted', function(e) {{
e.layers.eachLayer(function(layer) {{
drawnItems.removeLayer(layer);
}});
updateGeoJsonOutput(drawnItems.toGeoJSON());
}});
{map_name}.on('draw:edited', function(e) {{
updateGeoJsonOutput(drawnItems.toGeoJSON());
}});
}});
</script>
"""
)
)
return fmap
def CreateDatasetMap(geojson_data: str) -> str:
"""GeoJSON verisinden GEE haritası üretir ve iframe olarak döndürür."""
if not geojson_data:
return "<p>Lütfen önce haritada bir bölge çizin.</p>"
geojson = json.loads(geojson_data)
features = geojson.get("features", [])
if not features:
return "<p>Çizili şekil bulunamadı.</p>"
coords = features[0]["geometry"]["coordinates"][0]
fmap = RequestFunction(coords)
if fmap is None:
return "<p>Veri alınamadı.</p>"
raw_html = fmap._repr_html_()
escaped = html.escape(raw_html)
return f"""<iframe
style="width:100%; height:520px; border:none;"
sandbox="allow-scripts allow-same-origin allow-popups allow-forms allow-modals"
allowfullscreen
srcdoc='{escaped}'
></iframe>"""
# Ana haritayı oluştur
basemap = CreateMap()
# Gradio Arayüzü
with gr.Blocks(title="GEE Harita Uygulaması") as app:
gr.Markdown("# GEE Harita Uygulaması")
gr.Markdown("Çalışmak istediğiniz bölgeyi harita üzerinde çizin, ardından veri çekin.")
with gr.Row():
geojson_process_btn = gr.Button("GeoJSON Al", elem_id="geojson_process", variant="secondary")
prepare_dataset_btn = gr.Button("Veri Çek", elem_id="prepare_dataset", variant="primary")
# Ana harita
map_html = gr.HTML(basemap._repr_html_(), elem_id="map_container")
# GEE sonuç haritası
dataset_map_html = gr.HTML(elem_id="dataset_map_container")
# Ham GeoJSON çıktısı (JS tarafından doldurulan gizli alan)
geojson_output = gr.Textbox(
value="",
placeholder="Çizilen şekillerin GeoJSON verisi burada görünür.",
label="Ham GeoJSON",
lines=4,
elem_id="geojson_output",
interactive=False,
)
# GeoJSON görünümü
geojson_view = gr.JSON(label="GeoJSON Görünümü")
# Event bağlantıları
geojson_process_btn.click(
fn=lambda data: json.loads(data) if data else {}, inputs=geojson_output, outputs=geojson_view, scroll_to_output=True
)
prepare_dataset_btn.click(fn=CreateDatasetMap, inputs=geojson_output, outputs=dataset_map_html, scroll_to_output=True)
app.queue(max_size=10)
app.launch(share_server_protocol="https")