KML তৈরি করতে PHP এবং MySQL ব্যবহার করে

মানো মার্কস, গুগল জিও টিম
জুন 2007

এই টিউটোরিয়ালটি এমন ডেভেলপারদের জন্য যারা PHP এবং MySQL এর সাথে পরিচিত এবং কিভাবে একটি MySQL ডাটাবেস থেকে KML তৈরি করতে হয় তা শিখতে চান। এই টিউটোরিয়ালটির জন্য, আপনি দুটি স্ক্রিপ্ট তৈরি করবেন যা গতিশীলভাবে সিয়াটেলের অবস্থানগুলির একটি ডাটাবেস থেকে KML তৈরি করে। প্রথম স্ক্রিপ্টটি পয়েন্টের একটি সংগ্রহ তৈরি করে, যেখানে দুই ধরনের স্থান-রেস্তোরাঁ এবং বার-কে আলাদা করে আইকন দ্বারা চিহ্নিত করা হয়। যখন ব্যবহারকারী একটি মার্কার ক্লিক করে, একটি বেলুন নাম এবং ঠিকানা তথ্য প্রদর্শন করে। দ্বিতীয় স্ক্রিপ্টটি একটি লাইন তৈরি করে যা সমস্ত রেস্টুরেন্টকে সংযুক্ত করে। টিউটোরিয়ালটি আরও দেখায় যে কীভাবে একটি Google মানচিত্র তৈরি করতে হয় যা KML ফাইলগুলি এবং একটি NetworkLink ফাইল প্রদর্শন করে যা KML ফাইলের দিকে নির্দেশ করে এবং ব্যবহারকারীকে Google Earth এ খুলতে সক্ষম করে।

এই টিউটোরিয়ালটি Pamela Fox-এর লেখা Google Maps-এর সাথে PHP/MySQL- এর প্রবন্ধের উপর ভিত্তি করে তৈরি করা হয়েছে, যা দেখায় কিভাবে পিএইচপি ব্যবহার করে একটি MySQL টেবিল থেকে Google Maps-এ ডেটা রপ্তানি করা যায়। আপনি যদি পামেলার নিবন্ধটি পড়ে থাকেন তবে আপনি এই টিউটোরিয়ালের প্রথম দুটি ধাপ এড়িয়ে যেতে পারেন। টিউটোরিয়ালের অবশিষ্টাংশ উল্লেখযোগ্যভাবে ভিন্ন কারণ এটি KML এর সাথে ডিল করে।

টিউটোরিয়ালটি নিম্নলিখিত ধাপে বিভক্ত:

  1. টেবিল তৈরি করা হচ্ছে
  2. টেবিল জনবহুল
  3. কেএমএল আউটপুট করতে পিএইচপি ব্যবহার করে
  4. আপনার KML ফাইলগুলি প্রদর্শন করা হচ্ছে৷
  5. এখান থেকে কোথায় যেতে হবে

গুগল আর্থের ছবি

ধাপ 1: টেবিল তৈরি করা

আপনি যখন MySQL টেবিল তৈরি করেন, আপনি lat এবং lng বৈশিষ্ট্যগুলিতে বিশেষ মনোযোগ দিতে চান। Google মানচিত্রের বর্তমান জুম ক্ষমতার সাথে, আপনার দশমিকের পরে শুধুমাত্র 6 সংখ্যার নির্ভুলতা প্রয়োজন। আমাদের টেবিলের জন্য প্রয়োজনীয় স্টোরেজ স্পেস ন্যূনতম রাখতে, আপনি উল্লেখ করতে পারেন যে lat এবং lng বৈশিষ্ট্যগুলি আকারের ফ্লোট (10,6)। এটি ক্ষেত্রগুলিকে দশমিকের পরে 6টি সংখ্যা, এবং দশমিকের আগে 4টি সংখ্যা পর্যন্ত সংরক্ষণ করতে দেবে, যেমন -123.456789 ডিগ্রি। আপনার টেবিলে প্রাথমিক কী হিসাবে পরিবেশন করার জন্য একটি id বৈশিষ্ট্য এবং রেস্তোঁরা এবং বারগুলির মধ্যে পার্থক্য করার জন্য একটি type বৈশিষ্ট্য থাকা উচিত।

দ্রষ্টব্য: এই টিউটোরিয়ালটি অবস্থানের ডেটা ব্যবহার করে যাতে ইতিমধ্যেই সংশ্লিষ্ট মার্কার প্লট করার জন্য প্রয়োজনীয় অক্ষাংশ এবং দ্রাঘিমাংশের তথ্য রয়েছে। আপনি যদি আপনার নিজের ডেটা ব্যবহার করার চেষ্টা করছেন যা এখনও সেই তথ্য নেই, তাহলে ঠিকানাগুলিকে অক্ষাংশ/দ্রাঘিমাংশে রূপান্তর করতে একটি ব্যাচ জিওকোডিং পরিষেবা ব্যবহার করুন৷ কিছু সাইট প্রতিবার পৃষ্ঠা লোড হওয়ার সময় জিওকোডিং ঠিকানার ভুল করে, কিন্তু এটি করার ফলে পৃষ্ঠা লোড হয় এবং অপ্রয়োজনীয় পুনরাবৃত্তি জিওকোড হয়। সম্ভব হলে অক্ষাংশ/দ্রাঘিমাংশের তথ্য হার্ড-কোড করা সর্বদা ভাল।

আপনি দুটি উপায়ে টেবিল ডেটা তৈরি করতে পারেন—হয় phpMyAdmin ইন্টারফেস ব্যবহার করে বা SQL কমান্ড ব্যবহার করে। এখানে আপনি কিভাবে phpMyAdmin ইন্টারফেস ব্যবহার করে টেবিল তৈরি করবেন।

এখানে সংশ্লিষ্ট SQL বিবৃতি যা টেবিল তৈরি করে। phpsqlajax_createtable.sql :

CREATE TABLE 'markers' (
'id' INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
'name' VARCHAR( 60 ) NOT NULL ,
'address' VARCHAR( 80 ) NOT NULL ,
'lat' FLOAT( 10, 6 ) NOT NULL ,
'lng' FLOAT( 10, 6 ) NOT NULL ,
'type' VARCHAR( 30 ) NOT NULL
) ENGINE = MYISAM ;


ধাপ 2: সারণি পপুলেট করা

টেবিলটি তৈরি করার পরে, এটি ডেটা দিয়ে পূরণ করার সময়। 10টি সিয়াটেল স্থানের জন্য নমুনা তথ্য নীচে প্রদান করা হয়েছে. phpMyAdmin-এ, আপনি CSV (কমা দ্বারা পৃথক করা মান) সহ বিভিন্ন ফাইল বিন্যাস আমদানি করতে IMPORT ট্যাব ব্যবহার করতে পারেন। মাইক্রোসফ্ট এক্সেল এবং গুগল স্প্রেডশীট উভয়ই CSV ফর্ম্যাটে রপ্তানি করে, তাই আপনি সহজেই CSV ফাইলগুলি রপ্তানি/আমদানি করার মাধ্যমে স্প্রেডশীট থেকে MySQL টেবিলে ডেটা স্থানান্তর করতে পারেন।

এখানে CSV ফর্ম্যাটে নমুনা ডেটা রয়েছে৷ phpsqlajax_data.csv :

Pan Africa Market,'1521 1st Ave, Seattle, WA',47.608941,-122.340145,restaurant
Buddha Thai & Bar,'2222 2nd Ave, Seattle, WA',47.613591,-122.344394,bar
The Melting Pot,'14 Mercer St, Seattle, WA',47.624562,-122.356442,restaurant
Ipanema Grill,'1225 1st Ave, Seattle, WA',47.606366,-122.337656,restaurant
Sake House,'2230 1st Ave, Seattle, WA',47.612825,-122.34567,bar
Crab Pot,'1301 Alaskan Way, Seattle, WA',47.605961,-122.34036,restaurant
Mama's Mexican Kitchen,'2234 2nd Ave, Seattle, WA',47.613975,-122.345467,bar
Wingdome,'1416 E Olive Way, Seattle, WA',47.617215,-122.326584,bar
Piroshky Piroshky,'1908 Pike pl, Seattle, WA',47.610127,-122.342838,restaurant

এই CSV কে টেবিল ডেটাতে রূপান্তর করতে ব্যবহৃত আমদানি বিকল্পগুলির একটি স্ক্রিনশট এখানে রয়েছে:

এখানে সংশ্লিষ্ট SQL বিবৃতি আছে. phpsqlajax_data.sql :

INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Pan Africa Market', '1521 1st Ave, Seattle, WA', '47.608941', '-122.340145', 'restaurant');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Buddha Thai & Bar', '2222 2nd Ave, Seattle, WA', '47.613591', '-122.344394', 'bar');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('The Melting Pot', '14 Mercer St, Seattle, WA', '47.624562', '-122.356442', 'restaurant');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Ipanema Grill', '1225 1st Ave, Seattle, WA', '47.606366', '-122.337656', 'restaurant');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Sake House', '2230 1st Ave, Seattle, WA', '47.612825', '-122.34567', 'bar');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Crab Pot', '1301 Alaskan Way, Seattle, WA', '47.605961', '-122.34036', 'restaurant');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Mama\'s Mexican Kitchen', '2234 2nd Ave, Seattle, WA', '47.613975', '-122.345467', 'bar');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Wingdome', '1416 E Olive Way, Seattle, WA', '47.617215', '-122.326584', 'bar');
INSERT INTO 'markers' ('name', 'address', 'lat', 'lng', 'type') VALUES ('Piroshky Piroshky', '1908 Pike pl, Seattle, WA', '47.610127', '-122.342838', 'restaurant');


ধাপ 3: KML আউটপুট করতে PHP ব্যবহার করে

এই মুহুর্তে, আপনার নমুনা ডেটা দিয়ে ভরা "মার্কার" নামের একটি টেবিল থাকা উচিত। টেবিলের ডেটা কেএমএল ফরম্যাটে রপ্তানি করতে আপনাকে এখন কিছু PHP স্টেটমেন্ট লিখতে হবে। আপনি যদি কখনও MySQL ডাটাবেসের সাথে সংযোগ করার জন্য PHP না লিখে থাকেন, তাহলে আপনার php.net পরিদর্শন করা উচিত এবং my_sql_query mysql_connect mysql_select_db mysql_error এ পড়া উচিত।

আপনার ডাটাবেস সংযোগের তথ্য একটি পৃথক ফাইলে রাখা উচিত। আপনি যখনই একটি ডাটাবেস অ্যাক্সেস করার জন্য PHP ব্যবহার করছেন তখন এটি সাধারণত একটি ভাল ধারণা, কারণ এটি আপনার গোপনীয় তথ্য একটি ফাইলে রাখে যা আপনি শেয়ার করতে প্রলুব্ধ হবেন না। মানচিত্র API ফোরামে, আমরা মাঝে মাঝে লোকেদের ভুলবশত তাদের ডাটাবেস সংযোগের তথ্য প্রকাশ করেছি যখন তারা কেবল তাদের কোড ডিবাগ করার চেষ্টা করছিল। ফাইলটি দেখতে এইরকম হওয়া উচিত, কিন্তু আপনার নিজস্ব ডাটাবেসের তথ্য পূরণ করে। phpsqlajax_dbinfo.php :

<?
$username = 'username';
$password = 'password';
$database = 'database';
$server = 'server'
?>

KML আউটপুট করতে PHP5 এর DOM ফাংশন ব্যবহার করে

এখানে নতুন জিনিস শুরু হয়. পামেলা ফক্সের আগের নিবন্ধে, তিনি PHP 4 কোড উপস্থাপন করেছিলেন যা একটি সাধারণ মার্কার ফাইল তৈরি করতে dom_xml এক্সটেনশন ব্যবহার করে যা পরে জাভাস্ক্রিপ্ট ব্যবহার করে পার্স করা হয়েছিল। এই টিউটোরিয়ালের জন্য, আপনি KML তৈরি করতে চান। জাভাস্ক্রিপ্টের মধ্য দিয়ে যাওয়ার পরিবর্তে, আপনি সরাসরি KML-এ প্লেসমার্ক স্টাইলিং নির্দিষ্ট করতে পারেন। এই টিউটোরিয়ালটি এমন কোড দেখাবে যা PHP 5 এর ইন্টিগ্রেটেড DOM লাইব্রেরি এবং PHP 4 dom_xml এক্সটেনশন উভয়ই ব্যবহার করে।

প্রথমে, আপনার কনফিগারেশন পরীক্ষা করুন বা আপনার সার্ভারের PHP-এ DOM কার্যকারিতা চালু আছে কিনা তা নির্ধারণ করতে একটি DOMDocument() শুরু করার চেষ্টা করুন। আপনার যদি DOM-এ অ্যাক্সেস থাকে, তাহলে আপনি XML নোড তৈরি করতে, চাইল্ড নোডগুলি যুক্ত করতে এবং একটি XML নথি আউটপুট করতে এটি ব্যবহার করতে পারেন। যেহেতু KML একটি XML মার্কআপ ভাষা, এটি KML এর জন্যও কাজ করে। যদি আপনার সার্ভারে DOM উপলব্ধ না থাকে, তাহলে dom_xml বা নীচে বর্ণিত echo পদ্ধতি ব্যবহার করার চেষ্টা করুন।

একবার আপনি নির্ধারণ করেছেন যে আপনি DOM এর সাথে চালিয়ে যেতে পারেন, মার্কার টেবিলে প্রতিটি সারির জন্য আলাদা স্থানচিহ্ন তৈরি করে শুরু করুন। PHP-তে, একটি নতুন XML নথি শুরু করুন এবং "kml" প্যারেন্ট নোড তৈরি করুন। একটি বৈশিষ্ট্য হিসাবে KML নামস্থান যোগ করুন। একটি KML <document> উপাদানের মৌলিক কাঠামো তৈরি করার পর, দুটি শৈলী তৈরি করুন—একটি রেস্তোরাঁর জন্য এবং একটি বারগুলির জন্য—যা পরে <styleUrl> উপাদানের মাধ্যমে প্লেসমার্ক দ্বারা উল্লেখ করা হবে।

এরপর, ডাটাবেসের সাথে সংযোগ করুন, মার্কার টেবিলে একটি SELECT * (সব নির্বাচন করুন) ক্যোয়ারী চালান এবং ফলাফলের মাধ্যমে পুনরাবৃত্তি করুন। টেবিলের প্রতিটি সারির জন্য (প্রতিটি অবস্থান), একটি নতুন <Placemark> উপাদান তৈরি করুন। সারি থেকে তথ্য বের করুন এবং <Placemark> , <name> , <description> , <styleUrl> , এবং <Point> এর চাইল্ড উপাদান তৈরি করতে এটি ব্যবহার করুন। সেই সারির জন্য type কলামের মানের উপর নির্ভর করে <styleUrl> উপাদানটিকে একটি মান বরাদ্দ করুন। তারপর <Point> উপাদানটিকে একটি শিশু উপাদান <coordinates> দিন এবং lng এবং lat কলামের মানগুলিকে এর মান হিসাবে একত্রিত করুন।

নীচের PHP ফাইলটি সঠিক HTML হেডার সহ একটি KML ফাইল তৈরি করে। এটি <name> উপাদানে name কলামের মান এবং <description> উপাদানে ঠিকানার মান নির্ধারণ করে। এই স্ক্রিপ্ট থেকে KML তৈরি করার পরে, আপনার একটি টেক্সট এডিটর বা ব্রাউজার দিয়ে ফলাফল যাচাই করা উচিত। phpsql_genkml.php :

<?php
require('phpsqlajax_dbinfo.php');

// Opens a connection to a MySQL server.

$connection = mysql_connect ($server, $username, $password);

if (!$connection)
{
  die('Not connected : ' . mysql_error());
}
// Sets the active MySQL database.
$db_selected = mysql_select_db($database, $connection);

if (!$db_selected)
{
  die('Can\'t use db : ' . mysql_error());
}

// Selects all the rows in the markers table.
$query = 'SELECT * FROM markers WHERE 1';
$result = mysql_query($query);

if (!$result)
{
  die('Invalid query: ' . mysql_error());
}

// Creates the Document.
$dom = new DOMDocument('1.0', 'UTF-8');

// Creates the root KML element and appends it to the root document.
$node = $dom->createElementNS('http://earth.google.com/kml/2.1', 'kml');
$parNode = $dom->appendChild($node);

// Creates a KML Document element and append it to the KML element.
$dnode = $dom->createElement('Document');
$docNode = $parNode->appendChild($dnode);

// Creates the two Style elements, one for restaurant and one for bar, and append the elements to the Document element.
$restStyleNode = $dom->createElement('Style');
$restStyleNode->setAttribute('id', 'restaurantStyle');
$restIconstyleNode = $dom->createElement('IconStyle');
$restIconstyleNode->setAttribute('id', 'restaurantIcon');
$restIconNode = $dom->createElement('Icon');
$restHref = $dom->createElement('href', 'http://maps.google.com/mapfiles/kml/pal2/icon63.png');
$restIconNode->appendChild($restHref);
$restIconstyleNode->appendChild($restIconNode);
$restStyleNode->appendChild($restIconstyleNode);
$docNode->appendChild($restStyleNode);

$barStyleNode = $dom->createElement('Style');
$barStyleNode->setAttribute('id', 'barStyle');
$barIconstyleNode = $dom->createElement('IconStyle');
$barIconstyleNode->setAttribute('id', 'barIcon');
$barIconNode = $dom->createElement('Icon');
$barHref = $dom->createElement('href', 'http://maps.google.com/mapfiles/kml/pal2/icon27.png');
$barIconNode->appendChild($barHref);
$barIconstyleNode->appendChild($barIconNode);
$barStyleNode->appendChild($barIconstyleNode);
$docNode->appendChild($barStyleNode);

// Iterates through the MySQL results, creating one Placemark for each row.
while ($row = @mysql_fetch_assoc($result))
{
  // Creates a Placemark and append it to the Document.

  $node = $dom->createElement('Placemark');
  $placeNode = $docNode->appendChild($node);

  // Creates an id attribute and assign it the value of id column.
  $placeNode->setAttribute('id', 'placemark' . $row['id']);

  // Create name, and description elements and assigns them the values of the name and address columns from the results.
  $nameNode = $dom->createElement('name',htmlentities($row['name']));
  $placeNode->appendChild($nameNode);
  $descNode = $dom->createElement('description', $row['address']);
  $placeNode->appendChild($descNode);
  $styleUrl = $dom->createElement('styleUrl', '#' . $row['type'] . 'Style');
  $placeNode->appendChild($styleUrl);

  // Creates a Point element.
  $pointNode = $dom->createElement('Point');
  $placeNode->appendChild($pointNode);

  // Creates a coordinates element and gives it the value of the lng and lat columns from the results.
  $coorStr = $row['lng'] . ','  . $row['lat'];
  $coorNode = $dom->createElement('coordinates', $coorStr);
  $pointNode->appendChild($coorNode);
}

$kmlOutput = $dom->saveXML();
header('Content-type: application/vnd.google-earth.kml+xml');
echo $kmlOutput;
?>

KML আউটপুট করতে PHP 4 এর dom_xml ব্যবহার করা

PHP 4-এর dom_xml ফাংশনগুলি PHP 5-এর DOM-এর মতোই। phpsql_genkml2.php :

<?php
require('phpsqlajax_dbinfo.php');

// Opens a connection to a MySQL server.
$connection=mysql_connect ($server, $username, $password);
if (!$connection)
{
  die('Not connected : ' . mysql_error());
}
// Sets the active MySQL database.
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected)
{
  die ('Can\'t use db : ' . mysql_error());
}

// Selects all the rows in the markers table.
$query = 'SELECT * FROM markers WHERE 1';
$result = mysql_query($query);
if (!$result)
{
  die('Invalid query: ' . mysql_error());
}

// Creates the Document.
$dom = new domxml_new_doc('1.0');

// Creates the root KML element and appends it to the root document.
$node = $dom->create_element_ns('http://earth.google.com/kml/2.1', 'kml');
$parNode = $dom->append_child($node);

// Creates a KML Document element and append it to the KML element.
$dnode = $dom->create_element('Document');
$docNode = $parNode->append_child($dnode);

//Creates the two Style elements, one for restaurant and one for bar, and append the elements to the Document element.
$restStyleNode = $dom->create_element('Style');
$restStyleNode->set_attribute('id', 'restaurantStyle');
$restIconstyleNode = $dom->create_element('IconStyle');
$restIconstyleNode->set_attribute('id', 'restaurantIcon');
$restIconNode = $dom->create_element('Icon');
$restHref = $dom->create_element('href', 'http://maps.google.com/mapfiles/kml/pal2/icon63.png');
$restIconNode->append_child($restHref);
$restIconstyleNode->append_child($restIconNode);
$restStyleNode->append_child($restIconstyleNode);
$docNode->append_child($restStyleNode);
$barStyleNode = $dom->create_element('Style');
$barStyleNode->set_attribute('id', 'barStyle');
$barIconstyleNode = $dom->create_element('IconStyle');
$barIconstyleNode->set_attribute('id', 'barIcon');
$barIconNode = $dom->create_element('Icon');
$barHref = $dom->create_element('href', 'http://maps.google.com/mapfiles/kml/pal2/icon27.png');
$barIconNode->append_child($barHref);
$barIconstyleNode->append_child($barIconNode);
$barStyleNode->append_child($barIconstyleNode);
$docNode->append_child($barStyleNode);

// Iterates through the MySQL results, creating one Placemark for each row.
while ($row = @mysql_fetch_assoc($result))
{
  // Creates a Placemark and append it to the Document.
  $node = $dom->create_element('Placemark');
  $placeNode = $docNode->append_child($node);
  // Creates an id attribute and assign it the value of id column.
  $placeNode->set_attribute('id', 'placemark' . $row['id']);

  // Create name, and description elements and assigns them the values of the name and address columns from the results.
  $nameNode = $dom->create_element('name',htmlentities($row['name']));
  $placeNode->append_child($nameNode);
  $descNode = $dom->  create_element('description', $row['address']);
  $placeNode->append_child($descNode);
  $styleUrl = $dom->create_element('styleUrl', '#' . $row['type'] . 'Style');
  $placeNode->append_child($styleUrl);
// Creates a Point element.
  $pointNode = $dom->create_element('Point');
  $placeNode->append_child($pointNode);
  
  // Creates a coordinates element and gives it the value of the lng and lat columns from the results.
  $coorStr = $row['lng'] . ','  . $row['lat'];
  $coorNode = $dom->create_element('coordinates', $coorStr);
  $pointNode->append_child($coorNode);
}

$kmlOutput = $dom->dump_mem(TRUE, 'UTF-8');
header('Content-type: application/vnd.google-earth.kml+xml');
echo $kmlOutput;
?>

আপনি দেখতে পাচ্ছেন, ফাংশনের নামের মধ্যে শব্দগুলিকে আলাদা করতে একটি আন্ডারস্কোর ("_") সহ উট কেস ( createElement ) ফাংশনগুলিকে সমস্ত ছোট হাতের অক্ষরে পরিণত করে বেশিরভাগ পার্থক্য সমাধান করা হয়। এই নিয়মের ব্যতিক্রম হল domxml_new_doc , যা PHP 5 DOMDocument দিয়ে প্রতিস্থাপন করে। এছাড়াও, dom_xml ব্যবহার করে, আপনি ফাইলটিকে মেমরিতে ডাম্প করার সময় এনকোডিং সেট করেন, আপনি যখন ফাইল তৈরি করেন তখন নয়।

KML আউটপুট করতে PHP এর ইকো ব্যবহার করে

আপনার যদি PHP এর DOM ফাংশনে অ্যাক্সেস না থাকে, তাহলে আপনি echo ফাংশন দিয়ে KML আউটপুট করতে পারেন।

  1. ডাটাবেসের সাথে সংযোগ করুন এবং মার্কার টেবিলে SELECT * (সব নির্বাচন করুন) ক্যোয়ারীটি চালান।
  2. স্ট্রিংগুলির একটি অ্যারে তৈরি করুন যা KML নথির মৌলিক কাঠামো তৈরি করে।
  3. তারপর টেবিলের প্রতিটি সারির জন্য অ্যারেতে একটি উপাদান যোগ করে ক্যোয়ারী ফলাফলের মাধ্যমে পুনরাবৃত্তি করুন (প্রতিটি অবস্থান)।
  4. সেই সারির জন্য প্লেসমার্ক এলিমেন্ট তৈরি করুন, htmlentities ফাংশনের মাধ্যমে নাম কলামটি পাস করুন যদি সেগুলিতে কোনো বিশেষ সত্তা থাকে।
  5. অ্যারেটিকে একটি বড় স্ট্রিংয়ে যুক্ত করে, শিরোনামগুলিকে প্রতিধ্বনিত করে এবং তারপর KML স্ট্রিংটিকে প্রতিধ্বনিত করে স্ক্রিপ্টটি শেষ করুন৷

পিএইচপি ফাইল যা এই সব করে তা নীচে দেখানো হয়েছে। phpsql_genkml3.php :

<?php
require('phpsqlajax_dbinfo.php');

// Opens a connection to a MySQL server.
$connection = mysql_connect ($server, $username, $password);
if (!$connection)
{
  die('Not connected : ' . mysql_error());
}

// Sets the active MySQL database.
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected)
{
  die ('Can\'t use db : ' . mysql_error());
}

// Selects all the rows in the markers table.
$query = 'SELECT * FROM markers WHERE 1';
$result = mysql_query($query);
if (!$result)
{
  die('Invalid query: ' . mysql_error());
}

// Creates an array of strings to hold the lines of the KML file.
$kml = array('<?xml version="1.0" encoding="UTF-8"?>');
$kml[] = '<kml xmlns="http://earth.google.com/kml/2.1">';
$kml[] = ' <Document>';
$kml[] = ' <Style id="restaurantStyle">';
$kml[] = ' <IconStyle id="restuarantIcon">';
$kml[] = ' <Icon>';
$kml[] = ' <href>http://maps.google.com/mapfiles/kml/pal2/icon63.png</href>';
$kml[] = ' </Icon>';
$kml[] = ' </IconStyle>';
$kml[] = ' </Style>';
$kml[] = ' <Style id="barStyle">';
$kml[] = ' <IconStyle id="barIcon">';
$kml[] = ' <Icon>';
$kml[] = ' <href>http://maps.google.com/mapfiles/kml/pal2/icon27.png</href>';
$kml[] = ' </Icon>';
$kml[] = ' </IconStyle>';
$kml[] = ' </Style>';

// Iterates through the rows, printing a node for each row.
while ($row = @mysql_fetch_assoc($result))
{
  $kml[] = ' <Placemark id="placemark' . $row['id'] . '">';
  $kml[] = ' <name>' . htmlentities($row['name']) . '</name>';
  $kml[] = ' <description>' . htmlentities($row['address']) . '</description>';
  $kml[] = ' <styleUrl>#' . ($row['type']) .'Style</styleUrl>';
  $kml[] = ' <Point>';
  $kml[] = ' <coordinates>' . $row['lng'] . ','  . $row['lat'] . '</coordinates>';
  $kml[] = ' </Point>';
  $kml[] = ' </Placemark>';

}

// End XML file
$kml[] = ' </Document>';
$kml[] = '</kml>';
$kmlOutput = join("\n", $kml);
header('Content-type: application/vnd.google-earth.kml+xml');
echo $kmlOutput;
?>

KML আউটপুট কাজ করে কিনা তা পরীক্ষা করা হচ্ছে

এটি বৈধ KML তৈরি করছে তা নিশ্চিত করতে ব্রাউজার থেকে এই PHP স্ক্রিপ্টটিকে কল করুন৷ যদি স্ক্রিপ্ট সঠিকভাবে কাজ করে, KML আউটপুট এই মত দেখায়. phpsqlkml_expectedoutput.kml :

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns = "http://earth.google.com/kml/2.1">
  <Document>
    <Style id="restaurantStyle">
      <IconStyle id="restuarantIcon">
      <Icon>
        <href>http://maps.google.com/mapfiles/kml/pal2/icon63.png</href>
      </Icon>
      </IconStyle>
    </Style>
    <Style id="barStyle">
      <IconStyle id="barIcon">
      <Icon>
        <href>http://maps.google.com/mapfiles/kml/pal2/icon27.png</href>
      </Icon>
      </IconStyle>
      </Style>
    <Placemark id="placemark1">
      <name>Pan Africa Market</name>
      <description>1521 1st Ave, Seattle, WA</description>
      <styleUrl>#restaurantStyle</styleUrl>
      <Point>
        <coordinates>-122.340141,47.608940</coordinates>
      </Point>
    </Placemark>
    <Placemark id="placemark2">
      <name>Buddha Thai &amp; Bar</name>
      <description>2222 2nd Ave, Seattle, WA</description>
      <styleUrl>#barStyle</styleUrl>
      <Point>
        <coordinates>-122.344391,47.613590</coordinates>
      </Point>
    </Placemark>
    <Placemark id="placemark3">
      <name>The Melting Pot</name>
      <description>14 Mercer St, Seattle, WA</description>
      <styleUrl>#restaurantStyle</styleUrl>
      <Point>
        <coordinates>-122.356445,47.624561</coordinates>
      </Point>
    </Placemark>
    <Placemark id="placemark4">
      <name>Ipanema Grill</name>
      <description>1225 1st Ave, Seattle, WA</description>
      <styleUrl>#restaurantStyle</styleUrl>
      <Point>
        <coordinates>-122.337654,47.606365</coordinates>
      </Point>
    </Placemark>
    <Placemark id="placemark5">
      <name>Sake House</name>
      <description>2230 1st Ave, Seattle, WA</description>
      <styleUrl>#barStyle</styleUrl>
      <Point>
      <coordinates>-122.345673,47.612823</coordinates>
      </Point>
    </Placemark>
    <Placemark id="placemark6">
      <name>Crab Pot</name>
      <description>1301 Alaskan Way, Seattle, WA</description>
      <styleUrl>#restaurantStyle</styleUrl>
      <Point>
        <coordinates>-122.340363,47.605961</coordinates>
      </Point>
    </Placemark>
    <Placemark id="placemark7">
      <name>Mama's Mexican Kitchen</name>
      <description>2234 2nd Ave, Seattle, WA</description>
      <styleUrl>#barStyle</styleUrl>
      <Point>
        <coordinates>-122.345467,47.613976</coordinates>
      </Point>
    </Placemark>
    <Placemark id="placemark8">
      <name>Wingdome</name>
      <description>1416 E Olive Way, Seattle, WA</description>
      <styleUrl>#barStyle</styleUrl>
      <Point>
        <coordinates>-122.326584,47.617214</coordinates>
      </Point>
    </Placemark>
    <Placemark id="placemark9">
      <name>Piroshky Piroshky</name>
      <description>1908 Pike pl, Seattle, WA</description>
      <styleUrl>#restaurantStyle</styleUrl>
      <Point>
        <coordinates>-122.342834,47.610126</coordinates>
      </Point>
    </Placemark>
</Document>
</kml>

একটি লাইন তৈরি করা

ডাটাবেস সম্পর্কে সেরা জিনিসগুলির মধ্যে একটি হল তাদের তথ্য একত্রিত করার ক্ষমতা। উদাহরণস্বরূপ, বিন্দুগুলির একটি সিরিজের একটি স্বাভাবিক অভিব্যক্তি হল একটি লাইন, অথবা KML-এ একটি <linestring> । পয়েন্টের একটি সিরিজ তৈরি করার চেয়ে এটি অর্জন করা আসলে সহজ। একটি স্ক্রিপ্ট তৈরি করুন যা একটি একক প্লেসমার্কের গঠন তৈরি করে। প্লেসমার্কে একটি <linestring> উপাদান রাখুন। তারপর সারির id দ্বারা আদেশকৃত সমস্ত স্থানাঙ্কের জন্য ডাটাবেস অনুসন্ধান করুন।

এখানে একটি নমুনা PHP স্ক্রিপ্ট যা সমস্ত রেস্তোরাঁর মধ্যে একটি <linestring> তৈরি করে, তাদের id অনুসারে, 100 মিটার উচ্চতায়, এক্সট্রুশন সহ। যদিও এটি Google Maps-এ দেখানো হবে না, Google Earth-এ এই স্ক্রিপ্টটি ডাটাবেসে প্রবেশ করানো ক্রমে Google আর্থ-এর সমস্ত রেস্তোরাঁর অবস্থানের মধ্য দিয়ে চলমান একটি 100-মিটার-উচ্চ প্রাচীর তৈরি করে। phpsql_genkml_ls.php :

<?php
require('phpsqlajax_dbinfo.php');

// Opens a connection to a MySQL server
$connection = mysql_connect ($server, $username, $password);

if (!$connection)
{
  die('Not connected : ' . mysql_error());
}

// Set the active MySQL database
$db_selected = mysql_select_db($database, $connection);

if (!$db_selected)
{
  die ('Can\'t use db : ' . mysql_error());
}

// Select all the rows in the markers table

$query = " SELECT GROUP_CONCAT(lng, ',', lat, ',', '100' separator ' ') AS coordinates FROM markers WHERE type = 'restaurant';";

$result = mysql_query($query);
if (!$result)
{
  die('Invalid query: ' . mysql_error());
}

// Start KML file, create parent node
$dom = new DOMDocument('1.0','UTF-8');

//Create the root KML element and append it to the Document
$node = $dom->createElementNS('http://earth.google.com/kml/2.1','kml');
$parNode = $dom->appendChild($node);

//Create a Folder element and append it to the KML element
$fnode = $dom->createElement('Folder');
$folderNode = $parNode->appendChild($fnode);

//Iterate through the MySQL results
$row = @mysql_fetch_assoc($result);

//Create a Placemark and append it to the document
$node = $dom->createElement('Placemark');
$placeNode = $folderNode->appendChild($node);

//Create an id attribute and assign it the value of id column
$placeNode->setAttribute('id','linestring1');

//Create name, description, and address elements and assign them the values of
//the name, type, and address columns from the results

$nameNode = $dom->createElement('name','My path');
$placeNode->appendChild($nameNode);
$descNode= $dom->createElement('description', 'This is the path that I took through my favorite restaurants in Seattle');
$placeNode->appendChild($descNode);

//Create a LineString element
$lineNode = $dom->createElement('LineString');
$placeNode->appendChild($lineNode);
$exnode = $dom->createElement('extrude', '1');
$lineNode->appendChild($exnode);
$almodenode =$dom->createElement(altitudeMode,'relativeToGround');
$lineNode->appendChild($almodenode);

//Create a coordinates element and give it the value of the lng and lat columns from the results

$coorNode = $dom->createElement('coordinates',$row['coordinates']);
$lineNode->appendChild($coorNode);
$kmlOutput = $dom->saveXML();

//assign the KML headers.
header('Content-type: application/vnd.google-earth.kml+xml');
echo $kmlOutput;
?>

যে স্ক্রিপ্ট আউটপুট এই মত দেখায়. phpsqlkml_expectedoutput_ls.kml :

<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://earth.google.com/kml/2.1'>
  <Folder>
    <Placemark id='linestring1'>
      <name>My path</name>
      <description>This is the path that I took through my favorite restaurants in Seattle</description>
      <LineString>
        <extrude>1</extrude>
       <altitudeMode>relativeToGround</altitudeMode>
        <coordinates>-122.340141,47.608940,100 -122.356445,47.624561,100
                     -122.337654,47.606365,100 -122.340363,47.605961,100
                     -122.342834,47.610126,100
        </coordinates>
    </LineString>
    </Placemark>
  </Folder>
</kml>

ধাপ 4: আপনার KML ফাইলগুলি প্রদর্শন করা হচ্ছে


Google Earth এ প্রদর্শন করুন

আপনি এখন Google Earth-এ এই ডেটা সহজেই প্রদর্শন করতে পারেন। এটি করার সর্বোত্তম উপায় হল একটি NetworkLink ফাইল তৈরি করা যা স্ক্রিপ্টের দিকে নির্দেশ করে। আপনি যদি ঘন ঘন আপনার ডেটা আপডেট করেন, আপনি কত ঘন ঘন এটি আপডেট করবেন তা মেলানোর জন্য রিফ্রেশ রেট সেট করতে পারেন। এখানে একটি ফাইলের একটি উদাহরণ যা এটি সম্পন্ন করবে। phpmysql_kmlnl.kml :

<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns = 'http://earth.google.com/kml/2.1'>
  <Folder>
    <NetworkLink>
      <Link>
        <href>http://example.com/phpsql_genkml.kml</href>
        <refreshMode>onInterval</refreshMode>
        <refreshInterval>3600</refreshInterval>
      </Link>
    </NetworkLink>
    <NetworkLink>
      <Link>
        <href>http://example.com/phpsql_genkml_ls.kml</href>
        <refreshMode>onInterval</refreshMode>
        <refreshInterval>3600</refreshInterval>
      </Link>
    </NetworkLink>
  </Folder>
</kml>

আপনার সার্ভারে স্ক্রিপ্টের পাথে <href> উপাদানটি পরিবর্তন করুন। Google Earth এর সাথে phpmysql_kmlnl.kml খুলুন। আপনি এটি দেখতে পাবেন:

Google Earth-এ NetworkLink প্রদর্শন করা হচ্ছে

Google Maps-এ একই ফাইল দেখতে, আপনাকে যা করতে হবে তা হল একটি মানচিত্র তৈরি করা এবং লিঙ্কটি স্ক্রিপ্টে বা NetworkLink ফাইলে যোগ করা। এই ক্ষেত্রে:

function load() 
{
  var map;
  var geoXml;

  if (GBrowserIsCompatible())
  {
    map = new GMap2(document.getElementById('map'));
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    geoXml = new GGeoXml('http://example.com/phpmysql_kmlnl.kml');
    map.addOverlay(geoXml);
    map.setCenter(new GLatLng(47.613976,-122.345467), 13);
  }
}

যা এই মত একটি মানচিত্র উত্পাদন করে:

গুগল ম্যাপের উদাহরণ

ধাপ 5: এখান থেকে কোথায় যেতে হবে

তাই এখন আপনি এই ডাটাবেস আছে, আপনি এটা দিয়ে কি করবেন? ভাল, ডাটাবেস সম্পর্কে মহান জিনিস যে আপনি তাদের যোগ করতে পারেন. একটি ডাটাবেস থেকে পরিবেশিত KML সম্পর্কে দুর্দান্ত জিনিস হল যে আপনি আপনার সামগ্রী রিফ্রেশ করতে পারেন। এগুলি একসাথে রাখুন এবং আপনি প্রচুর শক্তি পাবেন।

এবং KML-এ আপনি আরও অনেক কিছু করতে পারেন। Google আর্থের অনন্য কিছু বৈশিষ্ট্যের সুবিধা নিন, যেমন <NetworkLink> ফাইল যেগুলি <viewFormat> ব্যবহার করে। এই বৈশিষ্ট্যটি <networklink> কে আপনার স্ক্রিপ্টে পরামিতি পাঠাতে দেয়। কোন ডেটা ফেরত পাঠানো হয় তা পরিবর্তন করতে আপনি এই পরামিতিগুলি ব্যবহার করতে পারেন। অথবা <TimeStamp> এবং <TimeSpan> TimeSpan> ব্যবহার করুন যা আপনাকে একটি নির্দিষ্ট সময়ের মধ্যে KML প্লেসমার্কের অ্যানিমেশন করতে দেয়। সম্পর্কিত টেবিলে <Polygons> এর মতো জিনিসগুলি সংরক্ষণ করতে আরও জটিল টেবিল কাঠামো তৈরি করুন। অথবা একটি ওয়েব পৃষ্ঠা তৈরি করুন যা অন্য লোকেদের আপনার ডাটাবেসে ডেটা প্রবেশ করতে দেয়, যা পরবর্তী সময়ে স্ক্রিপ্ট কল করার সময় রিফ্রেশ হয়। সম্ভাবনার শেষ নেই.

উপরে ফিরে যাও