bbox-finder.html 11.4 KB
Newer Older
JOE XMG's avatar
update  
JOE XMG committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<!DOCTYPE html>
<html>

<head>
    <title>Joe BBOX Finder</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.1/font/bootstrap-icons.css">
    <link rel="stylesheet" href="libs/leaflet.css" />
    <link rel="stylesheet" href="./src/leaflet.draw.css" />

    <script src="libs/leaflet-src.js"></script>

    <script src="./src/Leaflet.draw.js"></script>
    <script src="./src/Leaflet.Draw.Event.js"></script>

    <script src="./src/edit/handler/Edit.Poly.js"></script>
    <script src="./src/edit/handler/Edit.SimpleShape.js"></script>
    <script src="./src/edit/handler/Edit.Rectangle.js"></script>
    <script src="./src/edit/handler/Edit.Marker.js"></script>
    <script src="./src/edit/handler/Edit.CircleMarker.js"></script>
    <script src="./src/edit/handler/Edit.Circle.js"></script>

    <script src="./src/draw/handler/Draw.Feature.js"></script>
    <script src="./src/draw/handler/Draw.Polyline.js"></script>
    <script src="./src/draw/handler/Draw.Polygon.js"></script>
    <script src="./src/draw/handler/Draw.SimpleShape.js"></script>
    <script src="./src/draw/handler/Draw.Rectangle.js"></script>
    <script src="./src/draw/handler/Draw.Circle.js"></script>
    <script src="./src/draw/handler/Draw.Marker.js"></script>
    <script src="./src/draw/handler/Draw.CircleMarker.js"></script>

    <script src="./src/ext/TouchEvents.js"></script>
    <script src="./src/ext/LatLngUtil.js"></script>
    <script src="./src/ext/GeometryUtil.js"></script>
    <script src="./src/ext/LineUtil.Intersect.js"></script>
    <script src="./src/ext/Polyline.Intersect.js"></script>
    <script src="./src/ext/Polygon.Intersect.js"></script>

    <script src="./src/Control.Draw.js"></script>
    <script src="./src/Tooltip.js"></script>
    <script src="./src/Toolbar.js"></script>

    <script src="./src/draw/DrawToolbar.js"></script>
    <script src="./src/edit/EditToolbar.js"></script>
    <script src="./src/edit/handler/EditToolbar.Edit.js"></script>
    <script src="./src/edit/handler/EditToolbar.Delete.js"></script>
JOE XMG's avatar
update    
JOE XMG committed
48
49
    <link rel="stylesheet" href="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css" />
<script src="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js"></script>
JOE XMG's avatar
up    
JOE XMG committed
50
51
52

    <link rel="shortcut icon" href="joeicon.png" />

JOE XMG's avatar
update  
JOE XMG committed
53
54
55
56
57
</head>

<body>
    <style>
        .calculation-box {
JOE XMG's avatar
update    
JOE XMG committed
58
59
            min-height: 90 px;
            height: auto;
JOE XMG's avatar
update  
JOE XMG committed
60
61
62
63
64
65
            width: 600px;
            position: absolute;
            bottom: 25px;
            left: 25px;
            background-color: rgba(255, 255, 255, 0.9);
            padding: 15px;
JOE XMG's avatar
update    
JOE XMG committed
66
            /* text-align: center; */
JOE XMG's avatar
update  
JOE XMG committed
67
68
69
70
71
72
73
74
75
76
77
78
            z-index: 1000;
        }

        p {
            /* font-family: 'Open Sans'; */
            margin: 0;
            font-size: 13px;
            font-weight: 600;
        }
    </style>
    <div id="map" style="width: 100%; height: 100vh;"></div>
    <div class="calculation-box text-left">
JOE XMG's avatar
JOE XMG committed
79
80
81
        <p class="text-bold text-wrap"> <b>
                <img src="joeicon.png" alt="" width="20px">
                BBOX Finder <i class="bi bi-bounding-box"></i></b>
JOE XMG's avatar
update  
JOE XMG committed
82
            <br>
Joe TS Dell's avatar
update    
Joe TS Dell committed
83
            <button class="btn btn-secondary btn-sm" onclick="startDraw()">DRAW</button><br>
JOE XMG's avatar
update  
JOE XMG committed
84
85
86
87
88
89
90
91
92
93
94
95
96
            <span id="calculated_area">[Hint: Draw a bbox using tool on the right-bottom menu.]</span>
        </p>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous">
    </script>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="./libs/proj4js.min.js"></script>
    <script>
        var Stadia_Outdoors = L.tileLayer('https://tiles.stadiamaps.com/tiles/outdoors/{z}/{x}/{y}{r}.png', {
            maxZoom: 20,
            attribution: '&copy; <a href="https://stadiamaps.com/">Stadia Maps</a>, &copy; <a href="https://openmaptiles.org/">OpenMapTiles</a> &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors'
        });
JOE XMG's avatar
JOE XMG committed
97
98
99
100
        var Esri_WorldTopoMap = L.tileLayer(
            'https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', {
                attribution: 'Tiles &copy; Esri &mdash; Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community'
            });
JOE XMG's avatar
update  
JOE XMG committed
101
102
103
104
105
106
107
108
        var tmp_layer
        var osmUrl = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
            osmAttrib = '&copy; <a href="http://openstreetmap.org/copyright">OpenStreetMap</a> contributors',
            osm = L.tileLayer(osmUrl, {
                maxZoom: 18,
                attribution: osmAttrib
            }),
            map = new L.Map('map', {
JOE XMG's avatar
JOE XMG committed
109
                layers: [Esri_WorldTopoMap],
JOE XMG's avatar
update  
JOE XMG committed
110
111
112
113
114
115
                center: new L.LatLng(48.7758, 9.1829),
                zoom: 15
            });

        var drawnItems = new L.FeatureGroup();
        map.addLayer(drawnItems);
Joe TS Dell's avatar
update    
Joe TS Dell committed
116
117
118
119
        // https://stackoverflow.com/questions/15775103/leaflet-draw-mapping-how-to-initiate-the-draw-function-without-toolbar
        startDraw = function () {
            new L.Draw.Rectangle(map, drawControl.options.rectangle).enable()
        }
JOE XMG's avatar
update  
JOE XMG committed
120
121
        // Set the title to show on the polygon button
        L.drawLocal.draw.toolbar.buttons.polygon = 'Draw a polygon!';
JOE XMG's avatar
update    
JOE XMG committed
122
        L.Control.geocoder().addTo(map);
JOE XMG's avatar
update  
JOE XMG committed
123
124
125
126
        var drawControl = new L.Control.Draw({
            position: 'bottomright',
            draw: {
                polyline: false,
JOE XMG's avatar
JOE XMG committed
127
                polygon: true,
JOE XMG's avatar
update  
JOE XMG committed
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
                circle: false,
                marker: false,
                circlemarker: false

            },
            edit: {
                featureGroup: drawnItems,
                remove: true
            }
        });
        map.addControl(drawControl);

        map.on(L.Draw.Event.CREATED, function (e) {
            if (tmp_layer !== undefined) {
                try {
                    map.removeLayer(tmp_layer)
                } catch (error) {}
            }
            var type = e.layerType,
                layer = e.layer;
            tmp_layer = layer
            if (type === 'marker') {
                layer.bindPopup('A popup!');
            }

            drawnItems.addLayer(layer);
            const answer = document.getElementById('calculated_area');
            // $("#")
            var source = new proj4.Proj('EPSG:4326'); //source coordinates will be in Longitude/Latitude
            proj4.defs("EPSG:31463",
                "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 +units=m +no_defs"
            );
            var dest = new proj4.Proj('EPSG:31463'); //source coordinates will be in Longitude/Latitude

            var p_min = new proj4.toPoint([tmp_layer._bounds._southWest.lng, tmp_layer._bounds._southWest
                .lat
            ]); //any object will do as long as it has 'x' and 'y' properties
JOE XMG's avatar
update    
JOE XMG committed
165
            var p_max = new proj4.toPoint([tmp_layer._bounds._northEast.lng, tmp_layer._bounds._northEast
JOE XMG's avatar
update  
JOE XMG committed
166
167
168
169
170
171
172
173
                .lat
            ]); //any object will do as long as it has 'x' and 'y' properties
            p_dest_min = proj4.transform(source, dest,
                p_min); //do the transformation.  x and y are modified in place
            p_dest_max = proj4.transform(source, dest,
                p_max); //do the transformation.  x and y are modified in place
            answer.innerHTML = `
                BBOX (4326): 
JOE XMG's avatar
update    
JOE XMG committed
174
                <input type="text" value="${tmp_layer._bounds._southWest.lng.toFixed(10)},${tmp_layer._bounds._southWest.lat.toFixed(10)},${tmp_layer._bounds._northEast.lng.toFixed(10)},${tmp_layer._bounds._northEast.lat.toFixed(10)}" id="4326" size="60">
JOE XMG's avatar
update  
JOE XMG committed
175
176
177
178
179
180
181
182

                <button class="badge bg-secondary" onclick="clickToCopy('4326')">click to copy</button>

                <br>
                
                BBOX (31463): 
                <input type="text" value="${p_dest_min.x.toFixed(4)},${p_dest_min.y.toFixed(4)},${p_dest_max.x.toFixed(4)},${p_dest_max.y.toFixed(4)}" id="31463" size="60">
                <button class="badge bg-secondary" onclick="clickToCopy('31463')">click to copy</button>
JOE XMG's avatar
update    
JOE XMG committed
183
184
185
186
187
188
189
190

                <hr>

                Try other epsg:
                <input type="number" placeholder="e.g. 31464, 3857" id="input_epsg"/> <button class="badge bg-secondary" onclick="convert_epsg()">convert</button>

                <span id="conversion_result"></span>

JOE XMG's avatar
update  
JOE XMG committed
191
                `;
JOE XMG's avatar
update    
JOE XMG committed
192
            console.log(`WFS Request (31463): http://193.196.137.147:8080/wfs?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&typeNames=bldg:Building&bbox=${p_dest_min.x.toFixed(4)},${p_dest_min.y.toFixed(4)},${p_dest_max.x.toFixed(4)},${p_dest_max.y.toFixed(4)}&srsName=EPSG:31463`)
JOE XMG's avatar
update  
JOE XMG committed
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
        });

        map.on(L.Draw.Event.EDITED, function (e) {
            var layers = e.layers;
            var countOfEditedLayers = 0;
            layers.eachLayer(function (layer) {
                countOfEditedLayers++;
            });
            console.log("Edited " + countOfEditedLayers + " layers");
        });

        function clickToCopy(id) {
            /* Get the text field */
            var copyText = document.getElementById(id);

            /* Select the text field */
            copyText.select();
            copyText.setSelectionRange(0, 99999); /* For mobile devices */

            /* Copy the text inside the text field */
            navigator.clipboard.writeText(copyText.value);

            /* Alert the copied text */
            alert("BBox Copied:<br>" + copyText.value);
        }
JOE XMG's avatar
update    
JOE XMG committed
218
219

        function convert_epsg() {
JOE XMG's avatar
update    
JOE XMG committed
220
            var input_epsg = $("#input_epsg").val()
JOE XMG's avatar
update    
JOE XMG committed
221
222
223
224
            var bbox_latlng =
                `${tmp_layer._bounds._southWest.lng},${tmp_layer._bounds._southWest.lat};${tmp_layer._bounds._northEast.lng},${tmp_layer._bounds._northEast.lat}`
            var conversion_service =
                `https://epsg.io/trans?data=${bbox_latlng}&s_srs=4326&t_srs=${input_epsg}`
JOE XMG's avatar
update    
JOE XMG committed
225
            // console.log(`request to ${conversion_service}...`)
JOE XMG's avatar
update    
JOE XMG committed
226
227
228
229
230
231
232
            $.getJSON(conversion_service, function (data) {
                if (data.status) {
                    $("#conversion_result").html("ESPG Code not support or invalid EPSG Code.")
                } else {
                    var result = `
                        <br>
                        BBOX (${input_epsg}): 
JOE XMG's avatar
update    
JOE XMG committed
233
                        <input type="text" value="${parseFloat(data[0]["x"]).toFixed(4)},${parseFloat(data[0]["y"]).toFixed(4)},${parseFloat(data[1]["x"]).toFixed(4)},${parseFloat(data[1]["y"]).toFixed(4)}" id="${input_epsg}" size="60">
JOE XMG's avatar
update    
JOE XMG committed
234
235
236
                        <button class="badge bg-secondary" onclick="clickToCopy('31463')">click to copy</button>
                        `
                    $("#conversion_result").html(result)
JOE XMG's avatar
update    
JOE XMG committed
237
                    console.log(`WFS Request (${input_epsg}): http://193.196.137.147:8080/wfs?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&typeNames=bldg:Building&bbox=${parseFloat(data[0]["x"]).toFixed(4)},${parseFloat(data[0]["y"]).toFixed(4)},${parseFloat(data[1]["x"]).toFixed(4)},${parseFloat(data[1]["y"]).toFixed(4)}&srsName=EPSG:${input_epsg}`)
JOE XMG's avatar
update    
JOE XMG committed
238
239
240
                }
            });
        }
JOE XMG's avatar
update  
JOE XMG committed
241
242
243
244
    </script>
</body>

</html>