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 &copy; <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 &copy; <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