استفاده از PHP و MySQL برای ایجاد KML

Mano Marks، تیم Google Geo
ژوئن 2007

این آموزش برای توسعه دهندگانی است که با PHP و MySQL آشنا هستند و می خواهند یاد بگیرند که چگونه KML را از پایگاه داده MySQL تولید کنند. برای این آموزش، شما دو اسکریپت ایجاد می کنید که به صورت پویا KML را از پایگاه داده مکان ها در سیاتل تولید می کنند. اسکریپت اول مجموعه ای از نقاط را با دو نوع مکان - رستوران ها و بارها - ایجاد می کند که با نمادهای متمایز مشخص شده اند. هنگامی که کاربر روی یک نشانگر کلیک می کند، یک بالون اطلاعات نام و آدرس را نمایش می دهد. اسکریپت دوم خطی را ایجاد می کند که همه رستوران ها را به هم متصل می کند. این آموزش همچنین نشان می دهد که چگونه یک نقشه گوگل ایجاد کنید که فایل های KML را نمایش می دهد و یک فایل NetworkLink که به فایل KML اشاره می کند و به کاربر امکان می دهد آن را در Google Earth باز کند.

این آموزش بر اساس مقاله Using PHP/MySQL with Google Maps نوشته Pamela Fox است که نحوه صادرات داده ها از جدول MySQL به Google Maps با استفاده از PHP را نشان می دهد. اگر مقاله پاملا را خوانده اید، می توانید دو مرحله اول این آموزش را رد کنید. بقیه آموزش به طور قابل توجهی متفاوت است زیرا با KML سروکار دارد.

آموزش به مراحل زیر تقسیم می شود:

  1. ایجاد جدول
  2. پر کردن جدول
  3. استفاده از PHP برای خروجی KML
  4. نمایش فایل های KML شما
  5. از اینجا به کجا برویم

تصویر Google Earth

مرحله 1: ایجاد جدول

هنگامی که جدول MySQL را ایجاد می کنید، می خواهید به ویژگی های lat و lng توجه ویژه ای داشته باشید. با قابلیت‌های زوم فعلی Google Maps، شما باید تنها به 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، می‌توانید از تب IMPORT برای وارد کردن فرمت‌های مختلف فایل، از جمله CSV (مقادیر جدا شده با کاما) استفاده کنید. Microsoft Excel و Google Spreadsheets هر دو به فرمت CSV صادر می کنند، بنابراین می توانید به راحتی داده ها را از صفحات گسترده به جداول MySQL از طریق صادرات/وارد کردن فایل های CSV انتقال دهید.

در اینجا داده های نمونه در قالب 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: استفاده از PHP برای خروجی KML

در این مرحله، شما باید جدولی به نام "نشانگرها" داشته باشید که با داده های نمونه پر شده است. اکنون باید چند عبارت PHP بنویسید تا داده های جدول را به فرمت KML صادر کنید. اگر هرگز PHP برای اتصال به پایگاه داده MySQL ننوشته‌اید، باید از php.net دیدن کنید و در مورد mysql_connect ، mysql_select_db ، my_sql_query ، و mysql_error مطالعه کنید.

شما باید اطلاعات اتصال پایگاه داده خود را در یک فایل جداگانه قرار دهید. این به طور کلی هر زمان که از PHP برای دسترسی به پایگاه داده استفاده می کنید ایده خوبی است، زیرا اطلاعات محرمانه شما را در فایلی نگه می دارد که وسوسه نمی شوید به اشتراک بگذارید. در تالار گفتمان Maps API، گاهی اوقات افرادی را داشته ایم که به طور تصادفی اطلاعات اتصال پایگاه داده خود را هنگامی که فقط سعی در اشکال زدایی کد خود داشتند منتشر می کنند. فایل باید شبیه این باشد، اما با اطلاعات پایگاه داده خود پر شده است. phpsqlajax_dbinfo.php :

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

استفاده از توابع DOM PHP5 برای خروجی KML

اینجاست که چیزهای جدید شروع می شود. در مقاله قبلی پاملا فاکس، او کد PHP 4 را ارائه کرد که از پسوند dom_xml برای ایجاد یک فایل نشانگر ساده استفاده می‌کرد که بعداً با استفاده از جاوا اسکریپت تجزیه شد. برای این آموزش، شما می خواهید KML تولید کنید. به جای مرور جاوا اسکریپت، می توانید استایل Placemark را مستقیماً در KML مشخص کنید. این آموزش کدی را نشان می دهد که از کتابخانه های DOM یکپارچه PHP 5 و پسوند PHP 4 dom_xml استفاده می کند.

ابتدا، پیکربندی خود را بررسی کنید یا سعی کنید یک DOMDocument() را مقداردهی کنید تا مشخص کنید آیا PHP سرور شما دارای عملکرد DOM است یا خیر. اگر به DOM دسترسی دارید، می توانید از آن برای ایجاد گره های XML، ضمیمه گره های فرزند و خروجی یک سند XML استفاده کنید. از آنجایی که KML یک زبان نشانه گذاری XML است، این زبان برای KML نیز کار می کند. اگر DOM در سرور شما در دسترس نیست، از روش dom_xml یا echo که در زیر توضیح داده شده است استفاده کنید.

هنگامی که تشخیص دادید که می توانید با DOM ادامه دهید، با ایجاد مکان مارک های مختلف برای هر ردیف در جدول نشانگرها شروع کنید. در PHP، یک سند XML جدید را مقداردهی اولیه کنید و گره والد "kml" را ایجاد کنید. فضای نام KML را به عنوان یک ویژگی اضافه کنید. پس از ایجاد ساختار اصلی عنصر <document> KML، دو سبک را بسازید - یکی برای رستوران ها و دیگری برای بارها - که بعداً توسط Placemarks از طریق عنصر <styleUrl> می شود.

سپس، به پایگاه داده متصل شوید، یک کوئری SELECT * (انتخاب همه) را در جدول نشانگرها اجرا کنید و نتایج را تکرار کنید. برای هر ردیف در جدول (هر مکان)، یک عنصر <Placemark> جدید ایجاد کنید. اطلاعات را از ردیف استخراج کنید و از آن برای ایجاد عناصر فرزند <Placemark <Placemark> ، <name> ، <description> ، <styleUrl> و <Point> استفاده کنید. بسته به مقدار ستون type برای آن سطر، عنصر <styleUrl> را تعیین کنید. سپس به عنصر <Point> یک عنصر فرزند <coordinates> بدهید و مقادیر ستون های lng و lat را به عنوان مقدار آن ترکیب کنید.

فایل PHP زیر یک فایل KML با هدرهای HTML مناسب ایجاد می کند. مقدار ستون 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;
?>

استفاده از dom_xml PHP 4 برای خروجی KML

توابع dom_xml PHP 4 بسیار شبیه به DOM PHP 5 است. 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;
?>

همانطور که می بینید، بیشتر تفاوت ها با تبدیل توابع camel case ( createElement ) به تمام حروف کوچک با یک زیرخط ("_") برای جدا کردن کلمات در نام تابع حل می شود. استثنای این قانون domxml_new_doc است که PHP 5 آن را با DOMDocument جایگزین می کند. همچنین، با استفاده از dom_xml ، رمزگذاری را زمانی که فایل را روی حافظه تخلیه می‌کنید، تنظیم می‌کنید، نه زمانی که فایل را ایجاد می‌کنید.

استفاده از اکو PHP برای خروجی KML

اگر به توابع DOM PHP دسترسی ندارید، می توانید به سادگی KML را با تابع echo خروجی بگیرید.

  1. به پایگاه داده متصل شوید و پرس و جو SELECT * (انتخاب همه) را در جدول نشانگرها اجرا کنید.
  2. آرایه ای از رشته ها ایجاد کنید که ساختار اصلی سند KML را تشکیل می دهند.
  3. سپس نتایج پرس و جو را تکرار کنید و برای هر ردیف در جدول (هر مکان) یک عنصر به آرایه اضافه کنید.
  4. عنصر Placemark را برای آن ردیف ایجاد کنید، ستون نام را از تابع htmlentities عبور دهید تا در صورتی که موجودیت های خاصی در آنها وجود داشته باشد.
  5. اسکریپت را با پیوستن آرایه به یک رشته بزرگ، بازتاب دادن سرصفحه ها، و سپس پژواک کردن رشته KML به پایان برسانید.

فایل PHP که همه این کارها را انجام می دهد در زیر نشان داده شده است. 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 کار می کند

این اسکریپت PHP را از مرورگر فراخوانی کنید تا مطمئن شوید که KML معتبر تولید می کند. اگر اسکریپت به درستی کار کند، خروجی 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> است. این در واقع ساده تر از ایجاد یک سری نکات است. یک اسکریپت ایجاد کنید که ساختار یک Placemark را ایجاد کند. یک عنصر <linestring> را در Placemarks قرار دهید. سپس از پایگاه داده برای همه مختصات، مرتب شده بر اساس id ردیف، پرس و جو کنید.

در اینجا یک نمونه اسکریپت PHP وجود دارد که یک <linestring> بین همه رستوران ها، به ترتیب id آنها، در ارتفاع 100 متری، با اکستروژن ایجاد می کند. در حالی که در Google Maps نمایش داده نمی‌شود، در Google Earth این اسکریپت دیواری به ارتفاع 100 متر ایجاد می‌کند که از میان تمام مکان‌های رستوران در Google Earth به ترتیب وارد شدن آنها به پایگاه داده می‌گذرد. 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> را به مسیر اسکریپت در سرور خود تغییر دهید. phpmysql_kmlnl.kml را با Google Earth باز کنید. این را خواهید دید:

نمایش NetworkLink در Google Earth

برای مشاهده همان فایل در 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 Earth، مانند فایل‌های <NetworkLink> که از <viewFormat> استفاده می‌کنند، استفاده کنید. این ویژگی به <networklink> اجازه می دهد تا پارامترها را به اسکریپت شما ارسال کند. می‌توانید از این پارامترها برای تغییر داده‌های ارسالی استفاده کنید. یا از <TimeStamp> و <TimeSpan> استفاده کنید که به شما این امکان را می‌دهد تا انیمیشن مکان‌نماهای KML را در یک دوره زمانی انجام دهید. ساختارهای جدول پیچیده تری برای ذخیره مواردی مانند <Polygons> در جداول مرتبط ایجاد کنید. یا یک صفحه وب ایجاد کنید که به افراد دیگر اجازه می‌دهد داده‌ها را در پایگاه داده شما وارد کنند، که سپس دفعه بعد که اسکریپت فراخوانی می‌شود، تازه‌سازی می‌شود. امکانات بی پایان هستند.

بازگشت به بالا