google map การสร้าง polygon ปักหมุด marker ปรับเปลี่ยนพิกัดได้

เขียนเมื่อ 10 ปีก่อน โดย Ninenik Narkdee
polygon google map

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ polygon google map

ดูแล้ว 22,784 ครั้ง


โค้ดในเนื้อตอนนี้ เป็นการประยุกต์จากบทความเก่าเรื่อง
 
การใช้งาน polyline และ polygon ใน google map api v3 
 
รูป icon ประกอบ สามารถไปโหลดจากบทความด้านบนได้
 
การทำงานของโปรแกรมในบทความนี้คือ เมื่อเราคลิก ที่ icon ปุ่มสร้าง polygon 
ในแผนที่แล้ว ก็จะสามารถ กดไปที่แผนที่ เพื่อวางจุด marker และเมื่อวาง marker 
มากกว่าหรือเท่ากับ สามจุดขึ้นไป โปรแกรมก็จะสร้าง polygon กำหนดขอบเขต
ตามจุด marker ที่เราวาง  โดยเราสามารถที่ย้ายตำแหน่ง ของจุดที่เรากำหนดได้
 
ค่า path ทั้งหมดจะแสดงใน textarea รายการด้านล่าง เราสามารถนำค่า submit 
ไปบันทึกลงฐานข้อมูล เพื่อนำไปใช้ได้ รวมทั้ง ยังมีการคำนวน หาระยะทาง โดยรอบ
ของ polygon และ พืนที่ของ polygon อีกด้วย หากต้องการ reset เพื่อกำหนดค่าใหม่
ให้คลิกที่ icon รูปมือ มุมล่างซ้ายของแผนที่
 
ตัวอย่าง
 

km (หากเป็น poligon จะเป็นขนาดความยาวโดยรอบ)
m2 (หาร 1000000 จะได้ เท่ากับหน่วย km2)

 
โค้ด ggm_polygon.php

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
<?php
// 3 บรรทัดนี้้ สำหรับป้องกันการ cache จำค่าเก่าตอนทพสอบ คงไว้ หรือเอาออกได้
header("Content-type:text/html; charset=UTF-8");         
header("Cache-Control: no-store, no-cache, must-revalidate");        
header("Cache-Control: post-check=0, pre-check=0", false);  
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Polygon 01</title>
    <link rel="stylesheet" href="bootstrap/css/bootstrap.css">
    <style type="text/css">
    html {
        height: 100%
    }
    body {
        height:100%;
        margin:0;
        padding:0;
        font-family:tahoma, "Microsoft Sans Serif", sans-serif, Verdana;
        font-size:12px;
    }
    /* css กำหนดความกว้าง ความสูงของแผนที่ */
    #map_canvas {
        position:relative;
        width:550px;
        height:400px;
        margin:auto;/*  margin-top:100px;*/
    }
    #contain_map {
        position:relative;
        width:550px;
        height:400px;
        margin:auto;
        margin-top:10px;
    }
    /* css ของส่วนการกำหนดจุดเริ่มต้น และปลายทาง */ 
    #showDD {
        position:absolute;
        bottom:5px;
        /*    background-color:#000;  */
        color:#FFF;
    }
    #show_form_data {
        margin:auto;
        width:550px;
    }
    #hand_b {
        width:31px;
        height:31px;
        cursor:pointer;
        background-image: url(images/Bsu.png);
    }
    #hand_b.selected {
        background-image: url(images/Bsd.png);
    }
    #shape_b {
        width:31px;
        height:31px;
        cursor:pointer;
        background-image: url(images/Bpu.png);
    }
    #shape_b.selected {
        background-image: url(images/Bpd.png);
    }
    </style>
</head>
<body>
    
   <br>
   <div class="container-fluid">
        <div id="contain_map">
          <div id="map_canvas"></div>
          <div id="showDD">
            <table>
              <tr>
                <td><div id="hand_b"
             onclick="stopEditing()"/></td>
                <td><div id="shape_b"
            onclick="startShape()"/></td>
              </tr>
            </table>
          </div>
        </div>
        <div id="show_form_data">
          <form role="form" id="form_get_detailMap" name="form_get_detailMap" method="post" action="">
           <div class="form-group col-xs-12">
               <label for="path_arr">Path Array</label>
               <textarea class="form-control" name="path_arr" id="path_arr" cols="70" rows="4"></textarea>
           </div>
           <div class="form-group col-xs-6">
               <label for="distance">Distance</label>
               <input class="form-control" name="distance" type="text" id="distance" value="" />
               <span>km (หากเป็น poligon จะเป็นขนาดความยาวโดยรอบ)</span>
           </div>
           <div class="form-group col-xs-6">
               <label for="area_data">Area</label>
               <input class="form-control" name="area_data" type="text" id="area_data" value="" />
               <span>m<sup>2</sup> (หาร 1000000 จะได้ เท่ากับหน่วย km<sup>2</sup>)</span>
           </div>
           <div class="form-group col-xs-12">
            <input type="submit" class="btn btn-primary" name="button" id="button" value="บันทึก" />
            </div>
          </form>
        </div>      
     
    </div>
   
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>  
<script src="//underscorejs.org/underscore-min.js"></script>
<script type="text/javascript">
/* ส่วนสำหรับการ random ค่าสีและ event */
var COLORS =[
    ["red", "#ff0000"],
    ["orange", "#ff8800"],
    ["green","#008000"],
    ["blue", "#000080"],
    ["purple", "#800080"]
];
var colorIndex_ = 0;
var listener;
 /* ส่วนของการกำหนดค่า สำหรับคำนวณพื้นที่ */
var earthRadiusMeters=6367460.0;
var metersPerDegree=2.0*Math.PI*earthRadiusMeters/360.0;
var degreesPerRadian=180.0/Math.PI;
var radiansPerDegree=Math.PI/180.0;
var metersPerKm=1000.0;
  
  
var map; // กำหนดตัวแปร map ไว้ด้านนอกฟังก์ชัน เพื่อให้สามารถเรียกใช้งาน จากส่วนอื่นได้
var GGM; // กำหนดตัวแปร GGM ไว้เก็บ google.maps Object จะได้เรียกใช้งานได้ง่ายขึ้น
var poly;
var polygon;
var marker=[];
var Points=[];
var path=[]; 
var arr_path=[];
function swap_class(buttonId) {
    $("#hand_b").removeClass("selected");
    $("#shape_b").removeClass("selected");
    $("#"+buttonId).addClass("selected");
}
function stopEditing() {
    swap_class("hand_b");
    $("#path_arr").val("");
    $("#distance").val("");
    $("#area_data").val("");
    if(listener!=undefined){
        GGM.event.removeListener(listener);
    }
    if(polygon!=undefined){
        console.log("IN");
        path=[];
        console.log("OUT");
        console.log(path);
        polygon.setMap(null);
    }  
    if(marker.length>0){
        for(i=0;i<marker.length;i++){
            marker[i].setMap(null);
        }
    }
}
  
function getColor(named) {
  return COLORS[(colorIndex_++) % COLORS.length][named ? 0 : 1];
}
  
function getIcon(color) {
  var icon = new GIcon();
  icon.image = "//google.com/mapfiles/ms/micons/" + color + ".png";
  icon.iconSize = new GSize(32, 32);
  icon.iconAnchor = new GPoint(15, 32);
  return icon;
}
  
function startShape(){
    swap_class("shape_b"); 
    var color = getColor(true);
    var polygonOptions = {
      strokeColor: color,
      geodesic:true,
      strokeOpacity: 1.0,
      strokeWeight: 3,
      fillColor: color,
      fillOpacity: 0.35  
    }
    polygon = new GGM.Polygon(polygonOptions);
    polygon.setMap(map);
     
    startDrawing_polygon(polygon,color);
     
}
function startDrawing_polygon(polygon,color){
        var i=0;
        var Points=[];
        path = polygon.getPath();
        var data_path="";
        listener=GGM.event.addListener(map, 'click', function(event){
            var val_latlng=[event.latLng.lat(),event.latLng.lng()];
//          console.log(val_latlng[0]);
//            console.log(val_latlng[1]);
            path.push(event.latLng);
            Points.push(event.latLng);
             
         
            data_path+=val_latlng[0]+","+val_latlng[1]+"\r\n"
            $("#path_arr").val(data_path);
            $("#distance").val(polygon.inKm());
            calculateArea(Points);
          
            // Add a new marker at the new plotted point on the polyline.
            var image="//google.com/mapfiles/ms/micons/"+color+".png";
            marker[i] = new GGM.Marker({
              position: event.latLng,
              title: ""+i,
              draggable:true,
              map: map,
              icon: image
            }); 
            GGM.event.addListener(marker[i], 'dragend', function(){ 
                path=[];
                var Points=[];
                var data_path="";
                polygon.setPath(path);
                path = polygon.getPath();
                $.each(marker,function(m,n){
                    path.push(marker[m].getPosition());
                    Points.push(marker[m].getPosition());
                    var val_latlng=marker[m].getPosition();
                    data_path+=val_latlng.lat()+","+val_latlng.lng()+"\r\n"
                });
                 
                calculateArea(Points);
                $("#path_arr").val(data_path);
                $("#distance").val(polygon.inKm());
                 
            });      
            i++;
             
             
        });
   
}
function calculateArea(points) {
    if(points.length>2) {
        var areaMeters2=PlanarPolygonAreaMeters2(points);
        if(areaMeters2>1000000.0) areaMeters2=SphericalPolygonAreaMeters2(points);
        $("#area_data").val(areaMeters2.toFixed(2));
    }
}
function PlanarPolygonAreaMeters2(points) {
    var a=0.0;
    for(var i=0;i<points.length;++i)
        {var j=(i+1)%points.length;
        var xi=points[i].lng()*metersPerDegree*Math.cos(points[i].lat()*radiansPerDegree);
        var yi=points[i].lat()*metersPerDegree;
        var xj=points[j].lng()*metersPerDegree*Math.cos(points[j].lat()*radiansPerDegree);
        var yj=points[j].lat()*metersPerDegree;
        a+=xi*yj-xj*yi;}
    return Math.abs(a/2.0);
}
function SphericalPolygonAreaMeters2(points) {
    var totalAngle=0.0;
    //alert(points[0]);
    for(i=0;i<points.length;++i)
        {var j=(i+1)%points.length;
        var k=(i+2)%points.length;
        totalAngle+=Angle(points[i],points[j],points[k]);}
    var planarTotalAngle=(points.length-2)*180.0;
    var sphericalExcess=totalAngle-planarTotalAngle;
    if(sphericalExcess>420.0)
        {totalAngle=points.length*360.0-totalAngle;
        sphericalExcess=totalAngle-planarTotalAngle;}
    else if(sphericalExcess>300.0&&sphericalExcess<420.0)
        {sphericalExcess=Math.abs(360.0-sphericalExcess);}
    return sphericalExcess*radiansPerDegree*earthRadiusMeters*earthRadiusMeters;
}
function Angle(p1,p2,p3) {
    var bearing21=Bearing(p2,p1);
    var bearing23=Bearing(p2,p3);
    var angle=bearing21-bearing23;
    if(angle<0.0) angle+=360.0;
    return angle;
}
function Bearing(from,to) {
    var lat1=from.lat()*radiansPerDegree;
    var lon1=from.lng()*radiansPerDegree;
    var lat2=to.lat()*radiansPerDegree;
    var lon2=to.lng()*radiansPerDegree;
    var angle=-Math.atan2(Math.sin(lon1-lon2)*Math.cos(lat2),Math.cos(lat1)*Math.sin(lat2)-Math.sin(lat1)*Math.cos(lat2)*Math.cos(lon1-lon2));
    if(angle<0.0) angle+=Math.PI*2.0;
    angle=angle*degreesPerRadian;
    return angle;
}
  
  
function initialize() { // ฟังก์ชันแสดงแผนที่
    GGM=new Object(google.maps); // เก็บตัวแปร google.maps Object ไว้ในตัวแปร GGM
    // กำหนดจุดเริ่มต้นของแผนที่
    var my_Latlng  = new GGM.LatLng(13.761728449950002,100.6527900695800);
    var my_mapTypeId=GGM.MapTypeId.ROADMAP; // กำหนดรูปแบบแผนที่ที่แสดง
    // กำหนด DOM object ที่จะเอาแผนที่ไปแสดง ที่นี้คือ div id=map_canvas
    var my_DivObj=$("#map_canvas")[0];
    // กำหนด Option ของแผนที่
    var myOptions = {
        zoom: 13, // กำหนดขนาดการ zoom
        center: my_Latlng , // กำหนดจุดกึ่งกลาง
        mapTypeId:my_mapTypeId // กำหนดรูปแบบแผนที่
    };
    map = new GGM.Map(my_DivObj,myOptions);// สร้างแผนที่และเก็บตัวแปรไว้ในชื่อ map
  GGM.LatLng.prototype.kmTo = function(a){
    var e = Math, ra = e.PI/180;
    var b = this.lat() * ra, c = a.lat() * ra, d = b - c;
    var g = this.lng() * ra - a.lng() * ra;
    var f = 2 * e.asin(e.sqrt(e.pow(e.sin(d/2), 2) + e.cos(b) * e.cos
(c) * e.pow(e.sin(g/2), 2)));
    return f * 6378.137;
  }
  GGM.Polyline.prototype.inKm = function(n){
    var a = this.getPath(n), len = a.getLength(), dist = 0;
    for(var i=0; i<len-1; i++){
      dist += a.getAt(i).kmTo(a.getAt(i+1));
    }
    return dist;
  }
   
  GGM.Polygon.prototype.inKm = function(n){
    var a = this.getPath(n), len = a.getLength(), dist = 0;
    var dist2=0;
    for(var i=0; i<len-1; i++){
      dist += a.getAt(i).kmTo(a.getAt(i+1));
    }
    dist2+=a.getAt(len-1).kmTo(a.getAt(0));
    return dist+dist2;
  
   
}
$(function(){
    // โหลด สคริป google map api เมื่อเว็บโหลดเรียบร้อยแล้ว
    // ค่าตัวแปร ที่ส่งไปในไฟล์ google map api
    // v=3.2&sensor=false&language=th&callback=initialize
    //  v เวอร์ชัน่ 3.2
    //  sensor กำหนดให้สามารถแสดงตำแหน่งทำเปิดแผนที่อยู่ได้ เหมาะสำหรับมือถือ ปกติใช้ false
    //  language ภาษา th ,en เป็นต้น
    //  callback ให้เรียกใช้ฟังก์ชันแสดง แผนที่ initialize
    $("<script/>", {
      "type": "text/javascript",
      src: "//maps.google.com/maps/api/js?v=3.2&sensor=false&language=th&callback=initialize"
    }).appendTo("body");   
});
</script>     
</body>
</html>


   เพิ่มเติมเนื้อหา ครั้งที่ 1 วันที่ 14-12-2018


ส่วนเพิ่มเติม จะรองรับแนวทางเบื้องต้น สำหรับการใช้งาน polygon ทั้งการสร้าง
การบันทึกลงฐานข้อมูล การนำข้อมูลมาแสดง และการแก้ไขข้อมูล รวมทั้งการปรับตำแหน่ง
ในขั้นตอนการแก้ไขข้อมูล
 

ดาวน์โหลด icon สำหรับ marker

http://bit.ly/2RYaCiC

 

คำสั่ง sql โครงสร้าง ตารางตัวอย่าง tbl_simple

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
CREATE TABLE `tbl_simple` (
  `id` int(11) NOT NULL,
  `title` varchar(100) NOT NULL,
  `data` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
--
-- Indexes for dumped tables
--
 
--
-- Indexes for table `tbl_simple`
--
ALTER TABLE `tbl_simple`
  ADD PRIMARY KEY (`id`);
 
--
-- AUTO_INCREMENT for dumped tables
--
 
--
-- AUTO_INCREMENT for table `tbl_simple`
--
ALTER TABLE `tbl_simple`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;COMMIT;
 

ไฟล์ dbconnect.php

1
2
3
4
5
6
7
8
9
10
11
<?php 
$mysqli = new mysqli("localhost", "root","","test"); 
/* check connection */
if ($mysqli->connect_errno) { 
    printf("Connect failed: %s\n", $mysqli->connect_error); 
    exit(); 
if(!$mysqli->set_charset("utf8")) { 
    printf("Error loading character set utf8: %s\n", $mysqli->error); 
    exit(); 
}

ไฟล์ตัวอย่าง demo.php

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
<?php
// 3 บรรทัดนี้้ สำหรับป้องกันการ cache จำค่าเก่าตอนทพสอบ คงไว้ หรือเอาออกได้
header("Content-type:text/html; charset=UTF-8");         
header("Cache-Control: no-store, no-cache, must-revalidate");        
header("Cache-Control: post-check=0, pre-check=0", false);  
?>
<?php
require_once("dbconnect.php");
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Polygon 01</title>
<!--    <link rel="stylesheet" href="bootstrap/css/bootstrap.css">-->
    <style type="text/css">
    html {
        height: 100%
    }
    body {
        height:100%;
        margin:0;
        padding:0;
        font-family:tahoma, "Microsoft Sans Serif", sans-serif, Verdana;
        font-size:12px;
    }
    /* css กำหนดความกว้าง ความสูงของแผนที่ */
    #map_canvas {
        position:relative;
        width:550px;
        height:400px;
        margin:auto;/*  margin-top:100px;*/
    }
    #contain_map {
        position:relative;
        width:550px;
        height:400px;
        margin:auto;
        margin-top:10px;
    }
    /* css ของส่วนการกำหนดจุดเริ่มต้น และปลายทาง */
    #showDD {
        position:absolute;
        bottom:5px;
        /*    background-color:#000;  */
        color:#FFF;
    }
    #show_form_data {
        margin:auto;
        width:550px;
    }
    #hand_b {
        width:31px;
        height:31px;
        cursor:pointer;
        background-image: url(images/Bsu.png);
    }
    #hand_b.selected {
        background-image: url(images/Bsd.png);
    }
    #shape_b {
        width:31px;
        height:31px;
        cursor:pointer;
        background-image: url(images/Bpu.png);
    }
    #shape_b.selected {
        background-image: url(images/Bpd.png);
    }
    </style>
</head>
<body>
<?php
 // ตัวอย่างโค้ดบันทึกลงฐานข้อมูล สามารถปรับเปลี่ยนเป็น insert หรือดัดแปลงเพิ่มเติมได้ตามต้องการ
if(isset($_POST['button']) && $_POST['button']!="" && isset($_POST['path_arr']) && $_POST['path_arr']!=""){
    if(isset($_POST['h_edit_id']) && $_POST['h_edit_id']!=""){ // UPDATE
        $sql="
        UPDATE tbl_simple SET
        data='".$_POST['path_arr']."'
        WHERE id='".$_POST['h_edit_id']."'
        ";
        $mysqli->query($sql);       
    }else{ // INSERT
        $sql="
        INSERT INTO tbl_simple SET
        data='".$_POST['path_arr']."'
        ";
        $mysqli->query($sql);       
    }
}
?>
<?php
function _setPolygonPath($path){
    list($lat,$lon) = explode(",",$path);
    return "{lat: $lat, lng: $lon}";
}
function _pathObj($path){
    return "[".implode(",\r\n",$path)."]";
}
//
$arr_path = array(); // ตำแแปรเก็บค่า lat lng สำหรับแสดงและแก้ไข
$h_edit_id = null; // ตัวแปรสำหรับเก็บค่า id ของรายการที่จะแก้ไข หรือดึงข้อมูลมาแสดงและแก้ไข
if(isset($_GET['edit_id']) && $_GET['edit_id']!=""){
    $sql = "
    SELECT * FROM tbl_simple WHERE id='".$_GET['edit_id']."'
    ";
    $result = $mysqli->query($sql);
    if($result){
        $row = $result->fetch_assoc();
        $h_edit_id = $row['id'];
        $arr_path = explode("\r\n",$row['data']);
        $path_obj = _pathObj(array_map("_setPolygonPath",$arr_path));
    //  print_r($arr_path);
    //  print_r($path_obj);
    }
}
 
?>   
   <br>
   <div class="container-fluid">
    <table class="table" style="width:550px;margin:auto;">
    <?php
    $sql = "
    SELECT * FROM tbl_simple
    ";
    $result = $mysqli->query($sql);
    if($result && $result->num_rows>0){  // คิวรี่ข้อมูลสำเร็จหรือไม่ และมีรายการข้อมูลหรือไม่
        while($row = $result->fetch_assoc()){ // วนลูปแสดงรายการ
    ?>
        <tr>
            <td>รายการ id ที่ <?=$row['id']?></td>
            <td width="50">
            <a href="?edit_id=<?=$row['id']?>" class="btn btn-xs btn-success">แก้ไข</a>
            </td>
        </tr>
        <?php
            }
        }
        ?>
    </table>
        <div id="contain_map">
          <div id="map_canvas"></div>
          <div id="showDD">
            <table>
              <tr>
                <td><div id="hand_b"
             onclick="stopEditing()"/></td>
                <td><div id="shape_b"
            onclick="startShape()"/></td>
              </tr>
            </table>
          </div>
        </div>
        <div id="show_form_data">
          <form role="form" id="form_get_detailMap" name="form_get_detailMap" method="post" action="demo.php">
           <div class="form-group col-xs-12">
               <label for="path_arr">Path Array</label>
               <textarea class="form-control" name="path_arr" id="path_arr" cols="70" rows="4"></textarea>
               <?php if(!empty($h_edit_id)){?>
               <input type="hidden" name="h_edit_id" value="<?=$h_edit_id?>">
               <?php } ?>
           </div>
           <div class="form-group col-xs-6">
               <label for="distance">Distance</label>
               <input class="form-control" name="distance" type="text" id="distance" value="" />
               <span>km (หากเป็น poligon จะเป็นขนาดความยาวโดยรอบ)</span>
           </div>
           <div class="form-group col-xs-6">
               <label for="area_data">Area</label>
               <input class="form-control" name="area_data" type="text" id="area_data" value="" />
               <span>m<sup>2</sup> (หาร 1000000 จะได้ เท่ากับหน่วย km<sup>2</sup>)</span>
           </div>
           <div class="form-group col-xs-12">
            <input type="submit" class="btn btn-primary" name="button" id="button" value="บันทึก" />
            </div>
          </form>
        </div>      
      
    </div>
 
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>  
<script src="//underscorejs.org/underscore-min.js"></script>
<script type="text/javascript">
/* ส่วนสำหรับการ random ค่าสีและ event */
var COLORS =[
    ["red", "#ff0000"],
    ["orange", "#ff8800"],
    ["green","#008000"],
    ["blue", "#000080"],
    ["purple", "#800080"]
];
var colorIndex_ = 0;
var listener;
 /* ส่วนของการกำหนดค่า สำหรับคำนวณพื้นที่ */
var earthRadiusMeters=6367460.0;
var metersPerDegree=2.0*Math.PI*earthRadiusMeters/360.0;
var degreesPerRadian=180.0/Math.PI;
var radiansPerDegree=Math.PI/180.0;
var metersPerKm=1000.0;
   
   
var map; // กำหนดตัวแปร map ไว้ด้านนอกฟังก์ชัน เพื่อให้สามารถเรียกใช้งาน จากส่วนอื่นได้
var GGM; // กำหนดตัวแปร GGM ไว้เก็บ google.maps Object จะได้เรียกใช้งานได้ง่ายขึ้น
var poly;
var polygon;
var marker=[];
var Points=[];
var path=[]; 
var arr_path=[];
var init_arr_path = [];
function swap_class(buttonId) {
    $("#hand_b").removeClass("selected");
    $("#shape_b").removeClass("selected");
    $("#"+buttonId).addClass("selected");
}
function stopEditing() {
    swap_class("hand_b");
    $("#path_arr").val("");
    $("#distance").val("");
    $("#area_data").val("");
    if(listener!=undefined){
        GGM.event.removeListener(listener);
    }
    if(polygon!=undefined){
        console.log("IN");
        path=[];
        init_arr_path=[];
        console.log("OUT");
        console.log(path);
        polygon.setMap(null);
    }  
    if(marker.length>0){
        for(i=0;i<marker.length;i++){
            marker[i].setMap(null);
        }
    }
}
   
function getColor(named) {
  return COLORS[(colorIndex_++) % COLORS.length][named ? 0 : 1];
}
   
function getIcon(color) {
  var icon = new GIcon();
  icon.image = "//www.example.com/images/iconsdata/letter_"+color+"/letter_a.png";
  icon.iconSize = new GSize(32, 32);
  icon.iconAnchor = new GPoint(15, 32);
  return icon;
}
   
function startShape(){
    swap_class("shape_b"); 
    var color = getColor(true);
    var polygonOptions = {
      strokeColor: color,
      geodesic:true,
      strokeOpacity: 1.0,
      strokeWeight: 3,
      fillColor: color,
      fillOpacity: 0.35  
    }
    polygon = new GGM.Polygon(polygonOptions);
    polygon.setMap(map);
      
     <?php
     // ถ้ามีการดึงข้อมูลจาก db และมีรายการข้อมูล
    if(isset($arr_path) && count($arr_path)>0){
        foreach($arr_path as $path_val){
    ?>
        // นำค่าไปใช้สำหรับแสดงกรณีแก้ไขข้อมูล
        init_arr_path.push(new GGM.LatLng(<?=$path_val?>));
    <?php
        }
    }
     ?>
     if(init_arr_path.length>0){ // ถ้ามีข้อมูลสำหรับแก้ไข
         startDrawing_polygon_gen(polygon,color,init_arr_path);
     }else{
        startDrawing_polygon(polygon,color);
     }
      
}
 
function startDrawing_polygon(polygon,color){
        var i=0;
        var Points=[];
        path = polygon.getPath();
        var data_path="";
        listener=GGM.event.addListener(map, 'click', function(event){
            var val_latlng=[event.latLng.lat(),event.latLng.lng()];
//          console.log(val_latlng[0]);
//            console.log(val_latlng[1]);
            path.push(event.latLng);
            Points.push(event.latLng);
              
          
            data_path+=val_latlng[0]+","+val_latlng[1]+"\r\n"
            $("#path_arr").val(data_path);
            $("#distance").val(polygon.inKm());
            calculateArea(Points);
           
            // Add a new marker at the new plotted point on the polyline.
            var image="//www.example.com/images/iconsdata/letter_"+color+"/letter_a.png";
            marker[i] = new GGM.Marker({
              position: event.latLng,
              title: ""+i,
              draggable:true,
              map: map,
              icon: image
            }); 
            GGM.event.addListener(marker[i], 'dragend', function(){ 
                path=[];
                var Points=[];
                var data_path="";
                polygon.setPath(path);
                path = polygon.getPath();
                $.each(marker,function(m,n){
                    path.push(marker[m].getPosition());
                    Points.push(marker[m].getPosition());
                    console.log(marker[m].getPosition().lat());
                    console.log(marker[m].getPosition().lng());
                    var val_latlng=marker[m].getPosition();      
                    data_path+=val_latlng.lat()+","+val_latlng.lng()+"\r\n"
                });
                  
                calculateArea(Points);
                $("#path_arr").val(data_path);
                $("#distance").val(polygon.inKm());
                  
            });      
            i++;
              
              
        });
    
}
function startDrawing_polygon_gen(polygon,color,position){
        var i=0;
        var Points=[];
        path = polygon.getPath();
        var data_path="";
        if(position.length>0){
            for(v=0;v<position.length;v++){
                console.log(position[v]);
                 
                path.push(position[v]);
                Points.push(position[v]);
                 
                 
                data_path+=position[v].lat()+","+position[v].lng()+"\r\n"
                $("#path_arr").val(data_path);
                $("#distance").val(polygon.inKm());
                calculateArea(Points);     
                 
               // Add a new marker at the new plotted point on the polyline.
                var image="//www.example.com/images/iconsdata/letter_"+color+"/letter_a.png";
                marker[i] = new GGM.Marker({
                  position: position[v],
                  title: ""+i,
                  draggable:true,
                  map: map,
                  icon: image
                }); 
                GGM.event.addListener(marker[i], 'dragend', function(){ 
                    path=[];
                    var Points=[];
                    var data_path="";
                    polygon.setPath(path);
                    path = polygon.getPath();
                    $.each(marker,function(m,n){
                        path.push(marker[m].getPosition());
                        Points.push(marker[m].getPosition());
                        console.log(marker[m].getPosition().lat());
                        console.log(marker[m].getPosition().lng());
                        var val_latlng=marker[m].getPosition();   
                        data_path+=val_latlng.lat()+","+val_latlng.lng()+"\r\n"
                    });
                      
                    calculateArea(Points);
                    $("#path_arr").val(data_path);
                    $("#distance").val(polygon.inKm());
                      
                });      
                i++;               
                         
            }
        }
    
}
function calculateArea(points) {
    if(points.length>2) {
        var areaMeters2=PlanarPolygonAreaMeters2(points);
        if(areaMeters2>1000000.0) areaMeters2=SphericalPolygonAreaMeters2(points);
        $("#area_data").val(areaMeters2.toFixed(2));
    }
}
function PlanarPolygonAreaMeters2(points) {
    var a=0.0;
    for(var i=0;i<points.length;++i)
        {var j=(i+1)%points.length;
        var xi=points[i].lng()*metersPerDegree*Math.cos(points[i].lat()*radiansPerDegree);
        var yi=points[i].lat()*metersPerDegree;
        var xj=points[j].lng()*metersPerDegree*Math.cos(points[j].lat()*radiansPerDegree);
        var yj=points[j].lat()*metersPerDegree;
        a+=xi*yj-xj*yi;}
    return Math.abs(a/2.0);
}
function SphericalPolygonAreaMeters2(points) {
    var totalAngle=0.0;
    //alert(points[0]);
    for(i=0;i<points.length;++i)
        {var j=(i+1)%points.length;
        var k=(i+2)%points.length;
        totalAngle+=Angle(points[i],points[j],points[k]);}
    var planarTotalAngle=(points.length-2)*180.0;
    var sphericalExcess=totalAngle-planarTotalAngle;
    if(sphericalExcess>420.0)
        {totalAngle=points.length*360.0-totalAngle;
        sphericalExcess=totalAngle-planarTotalAngle;}
    else if(sphericalExcess>300.0&&sphericalExcess<420.0)
        {sphericalExcess=Math.abs(360.0-sphericalExcess);}
    return sphericalExcess*radiansPerDegree*earthRadiusMeters*earthRadiusMeters;
}
function Angle(p1,p2,p3) {
    var bearing21=Bearing(p2,p1);
    var bearing23=Bearing(p2,p3);
    var angle=bearing21-bearing23;
    if(angle<0.0) angle+=360.0;
    return angle;
}
function Bearing(from,to) {
    var lat1=from.lat()*radiansPerDegree;
    var lon1=from.lng()*radiansPerDegree;
    var lat2=to.lat()*radiansPerDegree;
    var lon2=to.lng()*radiansPerDegree;
    var angle=-Math.atan2(Math.sin(lon1-lon2)*Math.cos(lat2),Math.cos(lat1)*Math.sin(lat2)-Math.sin(lat1)*Math.cos(lat2)*Math.cos(lon1-lon2));
    if(angle<0.0) angle+=Math.PI*2.0;
    angle=angle*degreesPerRadian;
    return angle;
}
   
   
function initialize() { // ฟังก์ชันแสดงแผนที่
    GGM=new Object(google.maps); // เก็บตัวแปร google.maps Object ไว้ในตัวแปร GGM
    // กำหนดจุดเริ่มต้นของแผนที่
    var my_Latlng  = new GGM.LatLng(13.761728449950002,100.6527900695800);
    var my_mapTypeId=GGM.MapTypeId.ROADMAP; // กำหนดรูปแบบแผนที่ที่แสดง
    // กำหนด DOM object ที่จะเอาแผนที่ไปแสดง ที่นี้คือ div id=map_canvas
    var my_DivObj=$("#map_canvas")[0];
    // กำหนด Option ของแผนที่
    var myOptions = {
        zoom: 13, // กำหนดขนาดการ zoom
        center: my_Latlng , // กำหนดจุดกึ่งกลาง
        mapTypeId:my_mapTypeId // กำหนดรูปแบบแผนที่
    };
    map = new GGM.Map(my_DivObj,myOptions);// สร้างแผนที่และเก็บตัวแปรไว้ในชื่อ map
  GGM.LatLng.prototype.kmTo = function(a){
    var e = Math, ra = e.PI/180;
    var b = this.lat() * ra, c = a.lat() * ra, d = b - c;
    var g = this.lng() * ra - a.lng() * ra;
    var f = 2 * e.asin(e.sqrt(e.pow(e.sin(d/2), 2) + e.cos(b) * e.cos
(c) * e.pow(e.sin(g/2), 2)));
    return f * 6378.137;
  }
  GGM.Polyline.prototype.inKm = function(n){
    var a = this.getPath(n), len = a.getLength(), dist = 0;
    for(var i=0; i<len-1; i++){
      dist += a.getAt(i).kmTo(a.getAt(i+1));
    }
    return dist;
  }
    
  GGM.Polygon.prototype.inKm = function(n){
    var a = this.getPath(n), len = a.getLength(), dist = 0;
    var dist2=0;
    for(var i=0; i<len-1; i++){
      dist += a.getAt(i).kmTo(a.getAt(i+1));
    }
    dist2+=a.getAt(len-1).kmTo(a.getAt(0));
    return dist+dist2;
  
    
   startShape();
}
$(function(){
    // โหลด สคริป google map api เมื่อเว็บโหลดเรียบร้อยแล้ว
    // ค่าตัวแปร ที่ส่งไปในไฟล์ google map api
    // v=3.2&sensor=false&language=th&callback=initialize
    //  v เวอร์ชัน่ 3.2
    //  sensor กำหนดให้สามารถแสดงตำแหน่งทำเปิดแผนที่อยู่ได้ เหมาะสำหรับมือถือ ปกติใช้ false
    //  language ภาษา th ,en เป็นต้น
    //  callback ให้เรียกใช้ฟังก์ชันแสดง แผนที่ initialize
    $("<script/>", {
      "type": "text/javascript",
      src: "//maps.google.com/maps/api/js?v=3.2&key=YOUR_KEY&sensor=false&language=th&callback=initialize"
    }).appendTo("body");   
});
</script>     
</body>
</html>


 


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ







เนื้อหาที่เกี่ยวข้อง









URL สำหรับอ้างอิง











เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ