From 0c92ec366cb4b00b46d80b7ac8af60cfe628f7eb Mon Sep 17 00:00:00 2001 From: Fize Jacques <jacques.fize@cirad.fr> Date: Wed, 16 Sep 2020 09:28:59 +0200 Subject: [PATCH] SERVER FUNCTIONNAL --- lib/geocoder.py | 6 ++- server.py | 34 ++++++++++--- templates/cover.css | 106 --------------------------------------- templates/pair_topo.html | 6 +-- templates/skeleton.html | 67 ++++++++++++++----------- templates/text.html | 27 +++++++--- 6 files changed, 93 insertions(+), 153 deletions(-) delete mode 100644 templates/cover.css diff --git a/lib/geocoder.py b/lib/geocoder.py index 2ea2e25..1f92752 100644 --- a/lib/geocoder.py +++ b/lib/geocoder.py @@ -88,8 +88,8 @@ def heuritic_mean(geocoder,data): res_geocode["lat"] = lats results = {} for tp in toponyms: - lat = res_geocode[res_geocode.tc == tp].lat.mean() - lon = res_geocode[res_geocode.tc == tp].lon.mean() + lat = res_geocode[res_geocode.t == tp].lat.mean() + lon = res_geocode[res_geocode.t == tp].lon.mean() results[tp]={"lat":lat,"lon":lon} return results @@ -119,3 +119,5 @@ class TextGeocoder(): for e in range(len(entities)): entities[e]["coord"] = heuristic_results[entities[e]["text"]] return entities + + diff --git a/server.py b/server.py index 7b7cb4c..7209e00 100644 --- a/server.py +++ b/server.py @@ -1,13 +1,13 @@ -from flask import Flask, escape, request, render_template -#from lib.geocoder import Geocoder +from flask import Flask, escape, request, render_template,jsonify,Markup +from lib.geocoder import Geocoder,TextGeocoder,heuritic_mean -geocoder = None#Geocoder("./outputs/GB_MODEL_2/GB.txt_100_4_100__A_I_C.h5","./outputs/GB_MODEL_2/GB.txt_100_4_100__A_I_C_index") +geocoder = Geocoder("./outputs/GB_MODEL_2/GB.txt_100_4_100__A_I_C.h5","./outputs/GB_MODEL_2/GB.txt_100_4_100__A_I_C_index") app = Flask(__name__) @app.route('/') def home(): - toponym = request.args.get("top", "Paris") - c_toponym = request.args.get("c_top", "Cherbourg") + toponym = request.args.get("top", "") + c_toponym = request.args.get("c_top", "") if toponym and c_toponym: lon,lat = geocoder.get_coord(toponym,c_toponym) lon,lat = geocoder.wgs_coord(lon,lat) @@ -19,6 +19,26 @@ def home(): def text(): return render_template("text.html",title="Text Geocoder") -@app.route('/geocode') +@app.route('/geocode', methods=['POST', 'GET']) def geocode(): - pass \ No newline at end of file + if request.method == 'POST': + text = request.form["text"] + g_t = TextGeocoder(geocoder,"spacy","en",heuritic_mean) + results = g_t.geocode(g_t.extract_geo_entities(text)) + + html_, pos_ = "", 0 + for item in results: + start,end = item["start"], item["end"] + html_ = html_ + text[pos_:start] + "<span class=\"annotation place\">{0}</span>".format(text[start:end]) + pos_ = end + + place_coords = {} + for r in results: + if r["text"] in place_coords: + continue + place_coords[r["text"]]={"lat":float(r["coord"]["lat"]),"lon":float(r["coord"]["lon"])} + return render_template("text.html",title="Text Geocoder",data={"type":"success","output":Markup(html_),"place_coords":place_coords}) + + +if __name__ == "__main__": + app.run(host="0.0.0.0",debug=True) \ No newline at end of file diff --git a/templates/cover.css b/templates/cover.css deleted file mode 100644 index 7c6d33c..0000000 --- a/templates/cover.css +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Globals - */ - -/* Links */ -a, -a:focus, -a:hover { - color: #fff; -} - -/* Custom default button */ -.btn-secondary, -.btn-secondary:hover, -.btn-secondary:focus { - color: #333; - text-shadow: none; /* Prevent inheritance from `body` */ - background-color: #fff; - border: .05rem solid #fff; -} - - -/* - * Base structure - */ - -html, -body { - height: 100%; - background-color: #333; -} - -body { - display: -ms-flexbox; - display: flex; - color: #fff; - text-shadow: 0 .05rem .1rem rgba(0, 0, 0, .5); - box-shadow: inset 0 0 5rem rgba(0, 0, 0, .5); -} - -.cover-container { - max-width: 42em; -} - - -/* - * Header - */ -.masthead { - margin-bottom: 2rem; -} - -.masthead-brand { - margin-bottom: 0; -} - -.nav-masthead .nav-link { - padding: .25rem 0; - font-weight: 700; - color: rgba(255, 255, 255, .5); - background-color: transparent; - border-bottom: .25rem solid transparent; -} - -.nav-masthead .nav-link:hover, -.nav-masthead .nav-link:focus { - border-bottom-color: rgba(255, 255, 255, .25); -} - -.nav-masthead .nav-link + .nav-link { - margin-left: 1rem; -} - -.nav-masthead .active { - color: #fff; - border-bottom-color: #fff; -} - -@media (min-width: 48em) { - .masthead-brand { - float: left; - } - .nav-masthead { - float: right; - } -} - - -/* - * Cover - */ -.cover { - padding: 0 1.5rem; -} -.cover .btn-lg { - padding: .75rem 1.25rem; - font-weight: 700; -} - - -/* - * Footer - */ -.mastfoot { - color: rgba(255, 255, 255, .5); -} diff --git a/templates/pair_topo.html b/templates/pair_topo.html index d222fe9..0a03639 100644 --- a/templates/pair_topo.html +++ b/templates/pair_topo.html @@ -7,7 +7,7 @@ <!-- TOPONYM FORM --> <div class="container" style="background-color: white;padding: 5px;"> <p> - Lorem ipsum dolor sit amet consectetur adipisicing elit. Eum aliquid similique corporis, consequatur dicta itaque commodi ex est ad nemo atque dolore voluptatibus quidem totam? Ut incidunt quos similique veniam. + </p> <form action="/" method="get"> <div class="form-group"> @@ -41,9 +41,9 @@ 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Map data © <a href="https://www.openstreetmap.org/">OpenStreetMap</a>', }).addTo(mymap); - + {% if lat and lon %} var marker = L.marker([{{lat}}, {{lon}}]).addTo(mymap); - + {% endif %} </script> {% endblock %} \ No newline at end of file diff --git a/templates/skeleton.html b/templates/skeleton.html index fa7a527..a1139fd 100644 --- a/templates/skeleton.html +++ b/templates/skeleton.html @@ -6,18 +6,13 @@ <meta name="viewport" content="width=auto, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Geocoder Interface</title> - <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" - integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"> <link href="https://fonts.googleapis.com/css2?family=Kumbh+Sans:wght@300;400;700&display=swap" rel="stylesheet"> <!-- Load Leaflet --> - <link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.4/dist/leaflet.css" - integrity="sha512-puBpdR0798OZvTTbP4A8Ix/l+A4dHDD0DGqYW6RQ+9jxkRFclaxxQb/SJAWZfWAkuyeQUytO7+7N4QKrDh+drA==" - crossorigin="" /> - <script src="https://unpkg.com/leaflet@1.3.4/dist/leaflet.js" - integrity="sha512-nMMmRyTVoLYqjP9hrbed9S+FzjZHW5gY1TWCHA5ckwXZBadntCNs8kEqAWdrb9O7rxbCaA4lKTIWjDXZxflOcA==" - crossorigin=""></script> + <link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.4/dist/leaflet.css" integrity="sha512-puBpdR0798OZvTTbP4A8Ix/l+A4dHDD0DGqYW6RQ+9jxkRFclaxxQb/SJAWZfWAkuyeQUytO7+7N4QKrDh+drA==" crossorigin="" /> + <script src="https://unpkg.com/leaflet@1.3.4/dist/leaflet.js" integrity="sha512-nMMmRyTVoLYqjP9hrbed9S+FzjZHW5gY1TWCHA5ckwXZBadntCNs8kEqAWdrb9O7rxbCaA4lKTIWjDXZxflOcA==" crossorigin=""></script> </head> <body> @@ -25,14 +20,37 @@ body { font-family: 'Kumbh Sans', sans-serif; } - + #mapid { height: 400px; width: 100%; } - .container-fluid{ + + .container-fluid { padding: 0 !important; } + + .text_annotated { + line-height: 2em; + } + + .annotation { + border-radius: 5px; + color: white; + padding: 4px; + } + + .person { + background-color: #cf000f; + } + + .place { + background-color: #2c82c9; + } + + .org { + background-color: #00b16a; + } </style> <main class="container-fluid"> @@ -43,29 +61,22 @@ <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNavAltMarkup"> - <div class="navbar-nav"> - <a class="nav-link" href="/">Toponyms Pair Geocoder</a> - <a class="nav-link" href="/text">Text Geocoder</a> - </div> + <div class="navbar-nav"> + <a class="nav-link" href="/">Toponyms Pair Geocoder</a> + <a class="nav-link" href="/text">Text Geocoder</a> + </div> </div> - </nav> - <h2 class="text-center" style="margin-top: 0.5em;">{{title}}</h2> - {% block content %}{% endblock %} + </nav> + <h2 class="text-center" style="margin-top: 0.5em;">{{title}}</h2> + {% block content %}{% endblock %} </main> <!-- JS SCRIPTS --> - <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" - integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" - crossorigin="anonymous"></script> - <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" - integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" - crossorigin="anonymous"></script> - <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" - integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" - crossorigin="anonymous"></script> + <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script> + <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script> - {% block script%} - {% endblock %} + {% block script%} {% endblock %} </body> </html> \ No newline at end of file diff --git a/templates/text.html b/templates/text.html index 0109f22..ef3ba60 100644 --- a/templates/text.html +++ b/templates/text.html @@ -5,20 +5,21 @@ <!-- TOPONYM FORM --> <div class="container"> <p> - + </p> - <form action=""> + <form action="/geocode" method="post"> <div class="form-group"> - <label for="exampleFormControlTextarea1">Your text</label> - <textarea class="form-control" id="exampleFormControlTextarea1" rows="3"></textarea> + <label for="text"><h5>Your text</h5></label> + <textarea class="form-control" id="text" name="text" rows="3"></textarea> <br> <button class="btn btn-info" id="submit">Geocode</button> - </div> </form> <h5>Results :</h5> - <div class="col-lg-12" style="border:1px solid #666"> - <p id="result_container"></p> + <div class="col-lg-12" style="border:1px solid #999;border-radius:5px;"> + <p class="text_annotated" id="result_container"> + {% if data %} {{data["output"]}} {% endif %} + </p> </div> </div> @@ -37,5 +38,17 @@ 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Map data © <a href="https://www.openstreetmap.org/">OpenStreetMap</a>', }).addTo(mymap); + +</script> +{% if data %} +<script> + {% for place,coords in data["place_coords"].items() %} + var mark = L.marker([{{coords["lat"]}}, {{coords["lon"]}}],); + mark.bindPopup("{{place}}") + mark.addTo(mymap); + + {% endfor %} </script> +{% endif %} + {% endblock %} \ No newline at end of file -- GitLab