การนำ OpenstreetMap ไปทำแผนที่แสดงใน Component

การนำ OperstreetMap ไปทำแผนที่ใน Component ไปใช้งาน เช่น บันทึกที่อยู่ของผู้ใช้ เป็นต้น
ตัวอย่างการทำแผนที่ใน Component
ประเภทโค้ด: PHP OOP

การแสดงแผนที่บนเว็บไซต์ไม่เพียงแต่เพิ่มความน่าสนใจและความประทับใจให้กับผู้เยี่ยมชมเท่านั้น แต่ยังเป็นเครื่องมือที่มีประโยชน์ในการแสดงข้อมูลทางพื้นที่และการนำทาง ในบทความนี้เราจะสำรวจวิธีการนำ OpenStreetMap (OSM) ที่เป็นแผนที่ออนไลน์แบบเปิดตัวมาใช้ในเว็บไซต์ Joomla 3 โดยมีวัตถุประสงค์เพื่อให้ผู้ใช้สามารถรับชมแผนที่และข้อมูลทางภูมิศาสตร์ได้อย่างมีประสิทธิภาพและง่ายดาย

OpenStreetMap คืออะไร 

OpenStreetMap (OSM) เป็นโครงการที่รวมข้อมูลแผนที่ที่ถูกสร้างขึ้นโดยชุมชนและเปิดให้สาธารณชนแก้ไขและใช้งานได้ฟรี มันถูกสร้างขึ้นเพื่อเป็นแหล่งข้อมูลแผนที่และข้อมูลทางภูมิศาสตร์ที่มีความเที่ยงตรงและเปิดเผยให้คนทั่วไปใช้งานได้ตามต้องการ นอกจากนี้ OSM ยังเป็นเครื่องมือที่มีประโยชน์สำหรับการนำทาง การแสดงข้อมูลทางพื้นที่ และการสร้างแผนที่ที่กำหนดเองได้ตามความต้องการของผู้ใช้

ฟีเจอร์ของ OpenStreetMap 

  1. ข้อมูลที่รวบรวมโดยชุมชน ข้อมูลใน OSM ถูกสร้างขึ้นโดยคนทั่วไปที่เข้าร่วมโครงการ ทั้งจากการระบุตำแหน่งทางภูมิศาสตร์ในแผนที่ การเพิ่มข้อมูลเกี่ยวกับถนน สถานที่ และอื่น ๆ โดยใช้แอปพลิเคชันและเครื่องมือที่เปิดให้ใช้งาน
  2. ข้อมูลที่หลากหลาย OSM รวมข้อมูลทางภูมิศาสตร์ที่หลากหลาย เช่น แผนที่ถนน ข้อมูลทางน้ำ ข้อมูลภูเขา สถานที่สำคัญ และอื่น ๆ ที่สามารถใช้ในหลายๆ วัตถุประสงค์
  3. การอัพเดทและการคุณภาพ ข้อมูลใน OSM มีการอัพเดทอยู่เสมอและมีความคุณภาพสูง เนื่องจากมีชุมชนผู้ใช้ที่เฝ้าสังเกตและแก้ไขข้อมูลอย่างต่อเนื่อง
  4. การใช้งานหลายรูปแบบ OSM มีการใช้งานหลายรูปแบบ เช่น ผู้ใช้สามารถเข้าถึงแผนที่ผ่านเว็บไซต์ แอปพลิเคชันมือถือ และโปรแกรมคอมพิวเตอร์
  5. การใช้งานส่วนบุคคลและองค์กร OSM สามารถใช้งานในการแสดงแผนที่บนเว็บไซต์ส่วนตัว หรือในองค์กรต่างๆ โดยใช้เครื่องมือที่เหมาะสม
  6. การเข้าถึง API ใน OSM มี API (Application Programming Interface) ที่ช่วยให้นักพัฒนาสามารถนำข้อมูลแผนที่มาใช้ในแอปพลิเคชันหรือเว็บไซต์ที่พัฒนาขึ้นเองได้

ตัวอย่างการทำแผนที่ในตัว Component 

  1. ซึ่งก่อนเริ่มเราโหลดตัวไลบรารี่ซึ่ง่เราใช้ตัวของ Leaflet js ซึ่งเป็นไลบรารี่ในการทำ OpenStreetMap ใน Component อีกตัวหนึ่งซึ่งสามารถโหลดได้ที่ลิงก์นี้
  2. ให้เราทำการนำไฟล์มาใส่ในโฟลเดอร์ของ Component ของเรา ซึ่งในส่วนของโฟลเดอร์ administrator/components/com_mexample/assets และก็แบ่งโฟลเดอร์ css และ js
    ให้นำไฟล์ Leaflet มาใส่ในตัวของ Component ตามมาตรฐานของ joomla
    ตัวอย่างการนำไฟล์ Leaflet ไปใส่ใน Component
  3. จากนั้นให้เราทำการเพิ่ม tag div map มาทำแผนที่นั้นเองในไฟล์ edit.php ส่วนของหน้าบ้านเรา
    ตัวอย่าง path
    components/com_mexample/views/customer/tmpl/edit.php
    โค้ดที่เพิ่ม
    <?php
    /**
     * @package     M example
     * @subpackage  com_mexample
     */
    
    defined('_JEXEC') or die;
    
    JHtml::_('behavior.formvalidator');
    JHtml::_('behavior.keepalive');
    JHtml::_('formbehavior.chosen', 'select');
    
    $doc = JFactory::getDocument();
    $root = JUri::root();
    $doc->addScript($root . "administrator/components/com_mexample/assets/js/leaflet.js");
    $doc->addStyleSheet($root . "administrator/components/com_mexample/assets/css/style.css");
    $doc->addStyleSheet($root . "administrator/components/com_mexample/assets/css/leaflet.css");
    $doc->addScript($root . "components/com_mexample/assets/js/script.js");
    
    $doc->addScriptDeclaration("
    	Joomla.submitbutton = function(task)
    	{
    		if (task == 'customer.cancel' || document.formvalidator.isValid(document.getElementById('item-form'))) {
    			Joomla.submitform(task, document.getElementById('item-form'));
    		}
    	};
    ");
    
    ?>
    <form action="<?php echo JRoute::_('index.php?option=com_mexample&layout=edit&id=' . (int) $this->item->id); ?>"
        method="post" name="item-form" id="item-form" enctype="multipart/form-data" class="form-horizontal">
        <fieldset>
            <?php foreach ($this->form->getFieldset('detail') as $field): ?>
                <div class="control-group">
                    <div class="control-label">
                        <?php echo $field->label; ?>
                    </div>
                    <div class="controls">
                        <?php if ($field->id == 'jform_image' && $this->item->image): ?>
                            <img src="/<?php echo JUri::base() . 'components/com_mexample/assets/images/' . $this->item->image; ?>"
                                alt="#" style="max-width: 150px; width:100%;">
                            <br>
                        <?php endif; ?>
                        <?php echo $field->input; ?>
                    </div>
                </div>
            <?php endforeach; ?>
        </fieldset>
    
        <label for="map">
            <?php echo JText::_('COM_MEXAMPLE_ADDRESS_MAP'); ?>
        </label>
        <div class="map d-flex-map" id="map"></div>
    
        <a class="btn btn-primary" onclick="Joomla.submitbutton('customer.save')">
            <?php echo JText::_('COM_MEXAMPLE_SAVE'); ?>
        </a>
        <a class="btn" onclick="Joomla.submitbutton('customer.cancel')">
            <?php echo JText::_('COM_MEXAMPLE_CANCEL'); ?>
        </a>
        <input type="hidden" name="task" value="" />
        <?php echo JHtml::_('form.token'); ?>
    </form>​
  4. จากนั้นให้เพิ่มโค้ดตกแต่ง map ที่ไฟล์ style.css
    .map {
        width: 450px;
        height: 250px;
        background-color: #2d618c;
        border: 0.25rem solid #2d618c;
        border-radius: 10%;
    }​
  5. ต่อไปให้เราเขียนสคริป์ของ jQuery โดยให้เราสร้างไฟล์ที่มีชื่อว่า script.js
    ตัวอย่าง path
    components/com_mexample/assets/js/script.js

    โค้ด script.js
    jQuery(function ($) {
      var val_latitude = $('#jform_latitude').val();
      var val_longitude = $('#jform_longitude').val();
      var map = '';
      var marker = '';
      var markers = [];
    
      if (val_latitude !== '' && val_longitude !== '') {
        map = L.map("map").setView([val_latitude, val_longitude], 10);
         marker = L.marker([val_latitude, val_longitude]).addTo(map);
      } else {
        map = L.map("map").setView([13.8047478, 100.433413], 10);
        marker = L.marker([13.8047478, 100.433413]).addTo(map);
    
      }
    
      L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
        maxZoom: 19,
        attribution:
          '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
      }).addTo(map);
    
      map.on("click", onMapClick);
    
      function onMapClick(e) {
        removeAllMarkers();
        var newMarker = L.marker(e.latlng).addTo(map); 
        newMarker.bindPopup("ตำแหน่ง: " + e.latlng.toString()).openPopup(); 
        markers.push(newMarker);
        let latitude = e.latlng.lat; 
        let longitude = e.latlng.lng;
        $('#jform_latitude').val(latitude);
        $('#jform_longitude').val(longitude);
      }
    
      map.on("click", onMapClick);
    
      function removeAllMarkers() {
        map.removeLayer(marker);
        for (var i = 0; i < markers.length; i++) {
          map.removeLayer(markers[i]);
          markers = [];
        }
      }
    });​
    อธิบายการทำงานของโค้ด
    • เมื่อหน้าเว็บโหลดเสร็จเสมอ (เมื่อ jQuery เป็นพร้อมใช้), โค้ดที่อยู่ภายใน jQuery(function ($) { ... }); จะถูกเรียกใช้.

    • โค้ดด้านในเริ่มต้นโดยการดึงค่าละติจูดและลองจิจูดจากฟอร์ม HTML โดยใช้ $('#jform_latitude').val(); และ $('#jform_longitude').val();.

    • คำตอบจะถูกเก็บไว้ใน val_latitude และ val_longitude.

    • จากนั้นโค้ดตรวจสอบว่าค่า val_latitude และ val_longitude ไม่ว่าง (ถูกตั้งค่าจากฟอร์ม) หากมีค่าแล้ว จะสร้างแผนที่ Leaflet และ Marker ที่ตำแหน่งดังกล่าว. ถ้าไม่มีค่ากำหนดให้ใช้ตำแหน่งเริ่มต้นที่ [13.8047478, 100.433413] และสร้าง Marker ในตำแหน่งนี้.

    • จากนั้น, โค้ดทำการเพิ่มเลเยอร์แผนที่ (Tile Layer) จาก OpenStreetMap เพื่อแสดงแผนที่บนหน้าเว็บ.

    • โค้ดทำการเพิ่มการตรวจสอบเหตุการณ์คลิกบนแผนที่ (event listener) ซึ่งเรียกใช้ฟังก์ชัน onMapClick เมื่อคลิก.

    • ในฟังก์ชัน onMapClick, โค้ดทำการลบ Marker ที่มีอยู่ทั้งหมดจากแผนที่ด้วย removeAllMarkers() และสร้าง Marker ใหม่ที่ตำแหน่งที่คลิกเพื่อแสดง Popup และบันทึกละติจูดและลองจิจูดลงในฟอร์ม HTML.

    • สุดท้าย, มีฟังก์ชัน removeAllMarkers() ที่ใช้สำหรับการลบ Marker ออกจากแผนที่ หากมี Marker อยู่ใน markers และลบ Marker หลักที่เริ่มต้น.

  6. ให้เราเพิ่มฟิลด์เก็บค่า longitude และ latitude
    ALTER TABLE IF NOT EXISTS `#__mexample_customers` ADD `latitude` DECIMAL(9,6) NOT NULL AFTER `image`, ADD `longitude` DECIMAL(9,6) NOT NULL AFTER `latitude`;​
  7. และในไฟล์ customer.xml ให้เพิ่มฟิลด์ longitude และ latitude เวลาบันทึกข้อมูลลงใน Database
    <?xml version="1.0" encoding="utf-8"?>
    <form>
        <fieldset name="detail">
            <field
                    name="name"
                    type="text"
                    label="COM_MEXAMPLE_NAME"
                    description="COM_MEXAMPLE_NAME_DECS"
                    required="true"
            />
            <field
                    name="birthday"
                    type="calendar"
                    label="COM_MEXAMPLE_BIRTHDAY"
                    description="COM_MEXAMPLE_BIRTHDAY_DECS"
                    required="true"
            />
            <field
                    name="gender"
                    type="radio"
                    label="COM_MEXAMPLE_GENDER"
                    description="COM_MEXAMPLE_GENDER_DECS"
                    class="btn-group"
                    default="1"
                    >
                    <option value="1">COM_MEXAMPLE_MALE</option>
                    <option value="2">COM_MEXAMPLE_FEMALE</option>
            </field> 
            <field
                    name="age"
                    type="text"
                    label="COM_MEXAMPLE_AGE"
                    description="COM_MEXAMPLE_AGE_DECS"
                    required="true"
            />    
            <field
                    name="address"
                    type="textarea"
                    label="COM_MEXAMPLE_ADDRESS"
                    description="COM_MEXAMPLE_ADDRESS_DECS"
                    required="true"
            /> 
            <field
                    name="phone"
                    type="text"
                    label="COM_MEXAMPLE_PHONE"
                    description="COM_MEXAMPLE_PHONE_DECS"
            />
            <field
                    name="image"
                    type="file"
                    label="COM_MEXAMPLE_IMAGE"
                    description="COM_MEXAMPLE_IMAGE_DECS"
            /> 
            <field
                    name="latitude"
                    type="hidden"
            /> 
            <field
                    name="longitude"
                    type="hidden"
            />    
            <field
                    name="id"
                    type="hidden"
            />            
        </fieldset>
    </form>​
  8. แล้วเพียงเท่านี้ในฟอร์มของเราก็สามารถข้อมูลที่อยู่แบบติ๊กจุดมาร์คในแผนที่ได้แล้ว
    ตัวอย่างการเพิ่มระบบบันทึกให้ตัวผู้ใช้งานสามารถติ๊กที่อยู่ในแผนที่ได้
    ฟอร์มมีให้เก็บข้อมูลแผนที่

 

 

การนำ OpenStreetMap (OSM) มาใช้ในระบบเว็บ Joomla 3 ในการสร้างแผนที่แสดงข้อมูลทางภูมิศาสตร์ที่น่าสนใจและมีประโยชน์บนเว็บไซต์ของเรา โดยมีข้อสรุปหลักดังนี้ OSM เป็นโครงการข้อมูลแผนที่แบบเปิดตัวที่สร้างขึ้นโดยชุมชนและเปิดให้สาธารณชนใช้งานฟรี มันไม่เพียงแค่เป็นแหล่งข้อมูลแผนที่ที่เที่ยงตรงและมีคุณภาพสูง แต่ยังเป็นเครื่องมือที่ทรงพลังสำหรับการแสดงแผนที่และข้อมูลทางภูมิศาสตร์ในการนำทาง การแสดงข้อมูลทางพื้นที่ และการสร้างแผนที่ที่ปรับเพื่อตอบสนองความต้องการของผู้ใช้ และการนำ OSM เข้ามาใช้ใน Joomla 3 ช่วยให้ผู้ใช้สามารถแสดงแผนที่ที่เป็นประโยชน์และน่าสนใจบนเว็บไซต์ ไม่ว่าจะเป็นการแสดงตำแหน่งสถานที่ท่องเที่ยว การแสดงแผนที่สถิติ หรือแม้กระทั่งการแสดงแผนที่การจราจร โดยมีความยืดหยุ่นในการปรับแต่งแผนที่ให้ตรงกับสไตล์และความต้องการของเว็บไซต์ และการเรียนรู้เกี่ยวกับวิธีการเตรียมข้อมูล OSM และการนำมาแสดงใน Joomla 3 อาจเหมือนศึกษาความสามารถในการนำ OSM มาใช้ในโปรเจค เพื่อเพิ่มความมีนิยมและประโยชน์ให้กับเว็บไซต์ มันเป็นวิธีที่ดีในการเสริมสร้างประสบการณ์ผู้ใช้และการแสดงข้อมูลทางพื้นที่ที่มีค่าสำหรับเว็บไซต์

 


อ้างอิง
ประวัติความเป็นมา OpenStreetMap ,[ออนไลน์], เข้าถึงได้จาก https://www.mindphp.com/developer/openstreetmap/7910-opensteetmap.html
OpenstreetMap กับการใช้งานร่วม MySQL PHP ดึงพิกัดจากฐานข้อมูลมาปักหมุด ,[ออนไลน์], เข้าถึงได้จาก https://www.mindphp.com/developer/openstreetmap/7911-openstreetmap-php-mysql.html
Leaflet Tutorials ,[ออนไลน์], เข้าถึงได้จาก https://leafletjs.com/examples.html
กระทู้ล่าสุดจากเว็บบอร์ด
หัวข้อกระทู้
ตอบ
เปิดดู
ล่าสุด
ครบรอบ 15 ปี User mindphp ในเว็บนี้เราเดินทางมาไกล มากๆ
โดย mindphp ส 23 ก.ย. 2023 8:56 pm บอร์ด MindPHP News & Feedback
0
11
ส 23 ก.ย. 2023 8:56 pm โดย mindphp View Topic ครบรอบ 15 ปี User mindphp ในเว็บนี้เราเดินทางมาไกล มากๆ
คำสั่ง SQL สำหรับ DBA database administrator หรือ sysadmin ไว้หาตารางที่ ไม่มี index ในฐานข้อมูล MySQL mariaDB
โดย mindphp ส 23 ก.ย. 2023 6:45 pm บอร์ด SQL Knowledge
1
53
ส 23 ก.ย. 2023 7:02 pm โดย mindphp View Topic คำสั่ง SQL สำหรับ DBA database administrator หรือ sysadmin ไว้หาตารางที่ ไม่มี index ในฐานข้อมูล MySQL mariaDB
เคล็ดลับกระดูกติดเร็ว
โดย SexyKitty ส 23 ก.ย. 2023 4:38 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
16
ส 23 ก.ย. 2023 4:38 pm โดย SexyKitty View Topic เคล็ดลับกระดูกติดเร็ว
วิธีทำชีสเค้กญี่ปุ่น
โดย SexyKitty ส 23 ก.ย. 2023 2:03 am บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
24
ส 23 ก.ย. 2023 2:03 am โดย SexyKitty View Topic วิธีทำชีสเค้กญี่ปุ่น
ขนมปังบาแกตต์เมนูคุ้มค่าเช่าที่ในห้าง
โดย admeadme ศ 22 ก.ย. 2023 3:43 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
16
ศ 22 ก.ย. 2023 3:43 pm โดย admeadme View Topic ขนมปังบาแกตต์เมนูคุ้มค่าเช่าที่ในห้าง
G - ตั้งค่า config ฝั่งหลังบ้านและ phpBB ของระบบ Shop
โดย eange08 ศ 22 ก.ย. 2023 2:51 pm บอร์ด ThaiVI (Main)
7
45
ส 23 ก.ย. 2023 8:49 pm โดย mindphp View Topic G - ตั้งค่า config ฝั่งหลังบ้านและ phpBB ของระบบ Shop
ชุดเครื่องนอน 3.5 ฟุต ประกอบด้วยอะไรบ้าง
โดย totheworld ศ 22 ก.ย. 2023 1:21 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
15
ศ 22 ก.ย. 2023 1:21 pm โดย totheworld View Topic ชุดเครื่องนอน 3.5 ฟุต ประกอบด้วยอะไรบ้าง
AI and SEO
โดย God Of Backlinks ศ 22 ก.ย. 2023 10:27 am บอร์ด Software Review
0
18
ศ 22 ก.ย. 2023 10:27 am โดย God Of Backlinks View Topic AI and SEO