ที่อยู่สําหรับเข้ารหัสภูมิศาสตร์เพื่อใช้ใน KML

Mano Marks จากทีมภูมิศาสตร์ของ Google
ผู้เขียน: ธันวาคม 2007
อัปเดต: ธันวาคม 2013

วัตถุประสงค์

บทแนะนํานี้มีไว้สําหรับนักพัฒนาซอฟต์แวร์ที่คุ้นเคยกับการใช้ภาษาสคริปต์ และต้องการเรียนรู้วิธีใช้ Google GeoGeo API เพื่อใส่ที่อยู่ทางภูมิศาสตร์และรวมไว้ในไฟล์ KML แม้ว่าตัวอย่างโค้ดจะแสดงอยู่ใน Python แต่ก็สามารถปรับให้เข้ากับภาษาโปรแกรมอื่นๆ ส่วนใหญ่ได้ค่อนข้างง่าย

การเข้ารหัสพิกัดภูมิศาสตร์คือกระบวนการแปลงที่อยู่เป็นชุดพิกัดละติจูด/ลองจิจูดทําให้ระบุที่อยู่บนแผนที่ได้ คุณอาจต้องการเก็บที่อยู่ไว้ใน ภูมิศาสตร์ แล้ววางไว้ในไฟล์ KML โดยตรง กรณีนี้เกิดขึ้นได้บ่อย เช่น เมื่อมีการป้อนข้อมูลลงในแบบฟอร์มและคุณกําลังสร้างไฟล์ KML เพื่อตอบสนองต่อคําขอ ไฟล์ KML เหล่านี้สามารถจัดเก็บไว้ในฐานข้อมูล ในระบบไฟล์ หรือกลับไปที่ NetworkLink ที่เชื่อมต่อกับไฟล์ของคุณ โปรดทราบว่าเมื่อใช้เทคนิคนี้ คุณต้องปฏิบัติตามข้อกําหนดในการให้บริการสําหรับ Geoสัก API ดังกล่าว เนื่องจากมีข้อจํากัดเรื่องเวลาที่สามารถจัดเก็บผลการค้นหาได้ รวมถึงจํานวนองค์ประกอบที่สามารถระบุตําแหน่งทางภูมิศาสตร์ในแต่ละวันได้

บทแนะนํานี้แสดงวิธีใช้ Python เพื่อรับสตริง "1600 Amphitheatre Pkwy, Mountain View, CA 94043" และเปลี่ยนดังนี้

<?xml version='1.0' encoding='UTF-8'?> 
<kml xmlns='http://earth.google.com/kml/2.2'>
<Document>
<Placemark>
<description>1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA</description>
<Point>
<coordinates>-122.081783,37.423111,0</coordinates>
</Point>
</Placemark>
</Document>
</kml>

สร้างเอกสาร KML

KML เป็นภาษามาร์กอัป XML เราจึงสามารถใช้ฟังก์ชัน xml.dom.minidom ในตัวของ Python เพื่อสร้างเอกสาร KML มินิบาร์ของ Python เป็นการนํา DOM มาใช้ และ DOM รองรับในภาษาการจัดโปรแกรมส่วนใหญ่ ขั้นตอนนี้จึงง่ายในการย้ายไปยังภาษาโปรแกรมอื่น มีขั้นตอนดังนี้

  1. สร้างเอกสารโดยใช้ xml.dom.minidom.Document() ของ Python
  2. สร้างเอลิเมนต์ <kml> ระดับรูทโดยใช้ createElementNS.
  3. ต่อท้ายเอกสารโดยใช้ appendChild
  4. สร้างองค์ประกอบเอกสารโดยใช้ createElement
  5. ต่อท้ายองค์ประกอบ <kml> โดยใช้ appendChild
  6. สําหรับแต่ละอีเมล ให้สร้างองค์ประกอบ <Placemark> โดยใช้ createElement และต่อท้ายองค์ประกอบ Document จากนั้นสร้างเอลิเมนต์ <description> กําหนดค่าของที่อยู่ แล้วนําไปต่อท้ายองค์ประกอบ <Placemark>
  7. สร้างเอลิเมนต์ <Point> เพิ่มเอลิเมนต์ <coordinates> ย่อย แล้วต่อท้ายเอลิเมนต์ <Placemark>
  8. ส่งที่อยู่ไปยัง Maps API Geocoder ซึ่งจะส่งคําตอบในรูปแบบ JSON หรือ XML ใช้ urllib.urlopen() เพื่อเรียกข้อมูลไฟล์และอ่านเป็นสตริง
  9. แยกวิเคราะห์การตอบสนองและดึงองค์ประกอบลองจิจูดและละติจูด
  10. สร้างโหนดข้อความในองค์ประกอบ <coordinates> และกําหนดสตริงลองจิจูด/ละติจูดเป็นค่าของโหนด
  11. เขียนเอกสาร KML ลงในไฟล์ข้อความ

ตัวอย่างโค้ด Python

โปรดทราบว่าโค้ดตัวอย่างด้านล่างใช้ตัวแปร mapsKey จําลอง คุณจะต้องแทนที่คีย์นี้ด้วยคีย์ของคุณเอง

โค้ดตัวอย่างสําหรับการเขียนโค้ดพิกัดภูมิศาสตร์ด้วย Python 2.7 และเอาต์พุต JSON มีดังนี้

import urllib
import xml.dom.minidom
import json 

def geocode(address, sensor=False):
 # This function queries the Google Maps API geocoder with an
 # address. It gets back a csv file, which it then parses and
 # returns a string with the longitude and latitude of the address.

 # This isn't an actual maps key, you'll have to get one yourself.
 # Sign up for one here: https://code.google.com/apis/console/
  mapsKey = 'abcdefgh'
  mapsUrl = 'https://maps.googleapis.com/maps/api/geocode/json?address='
     
 # This joins the parts of the URL together into one string.
  url = ''.join([mapsUrl,urllib.quote(address),'&sensor=',str(sensor).lower()])
#'&key=',mapsKey])
  jsonOutput = str(urllib.urlopen(url).read ()) # get the response 
  # fix the output so that the json.loads function will handle it correctly
  jsonOutput=jsonOutput.replace ("\\n", "")
  result = json.loads(jsonOutput) # converts jsonOutput into a dictionary 
  # check status is ok i.e. we have results (don't want to get exceptions)
  if result['status'] != "OK": 
    return ""
  coordinates=result['results'][0]['geometry']['location'] # extract the geometry 
  return str(coordinates['lat'])+','+str(coordinates['lng'])

def createKML(address, fileName):
 # This function creates an XML document and adds the necessary
 # KML elements.

  kmlDoc = xml.dom.minidom.Document()
  
  kmlElement = kmlDoc.createElementNS('http://earth.google.com/kml/2.2','kml')

  kmlElement = kmlDoc.appendChild(kmlElement)

  documentElement = kmlDoc.createElement('Document')
  documentElement = kmlElement.appendChild(documentElement)

  placemarkElement = kmlDoc.createElement('Placemark')
  
  descriptionElement = kmlDoc.createElement('description')
  descriptionText = kmlDoc.createTextNode(address)
  descriptionElement.appendChild(descriptionText)
  placemarkElement.appendChild(descriptionElement)
  pointElement = kmlDoc.createElement('Point')
  placemarkElement.appendChild(pointElement)
  coorElement = kmlDoc.createElement('coordinates')

  # This geocodes the address and adds it to a  element.
  coordinates = geocode(address)
  coorElement.appendChild(kmlDoc.createTextNode(coordinates))
  pointElement.appendChild(coorElement)

  documentElement.appendChild(placemarkElement)

  # This writes the KML Document to a file.
  kmlFile = open(fileName, 'w')
  kmlFile.write(kmlDoc.toprettyxml(' '))  
  kmlFile.close()

if __name__ == '__main__':
  createKML('1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA', 'google.kml')

สิ่งอื่นๆ ที่ควรคํานึงถึง

การกําหนดเวลาคําขอรหัสพิกัดภูมิศาสตร์

คําขอการเข้ารหัสพิกัดภูมิศาสตร์จะขึ้นอยู่กับขีดจํากัดการค้นหาอัตราสูงสุดรายวันของผู้จดทะเบียนโดเมน โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับขีดจํากัดเหล่านี้ในเอกสารประกอบ Google Geocoding API โปรดระบุความล่าช้าระหว่างคําขอไวลด์การ์ดแต่ละคําขอเพื่อให้แน่ใจว่าไม่ได้ส่งการค้นหาเร็วเกินไปไปยังไวลด์การ์ด คุณอาจเพิ่มความล่าช้านี้ทุกครั้งที่ได้รับสถานะ OVER_QUERY_LIMIT และใช้รอบ while เพื่อให้แน่ใจว่าได้เข้ารหัสที่อยู่ลงในโดเมนต่างๆ แล้วก่อนที่จะย้ายไปยังอีเมลถัดไป

การเปลี่ยนประเทศฐาน

เครื่องมือจัดโปรแกรมถูกตั้งโปรแกรมให้การให้น้ําหนักพิเศษกับผลลัพธ์โดยขึ้นอยู่กับโดเมนต้นทาง ตัวอย่างเช่น การป้อน "syracuse" ในช่องค้นหาบน maps.google.com จะเข้ารหัสเมือง "Syracuse, NY" ขณะป้อนคําค้นหาเดียวกันใน maps.google.it (โดเมนของอิตาลี) จะค้นหาเมืองของ "Siracusa" ในซิซิลี คุณจะได้ผลลัพธ์เดียวกันได้โดยส่งคําค้นหานั้นผ่านการเข้ารหัสภูมิศาสตร์ HTTP ไปยัง maps.google.it แทน maps.google.com ซึ่งทําได้โดยการแก้ไขตัวแปร mapsUrl ในโค้ดตัวอย่างข้างต้น ดูข้อมูลเพิ่มเติมเกี่ยวกับการให้น้ําหนักพิเศษได้ในเอกสารประกอบของ Geocode API

หมายเหตุ: คุณไม่สามารถส่งคําขอไปยังเซิร์ฟเวอร์ Maps.google.* ที่ไม่มีอยู่ ดังนั้นโปรดตรวจสอบว่ามีโดเมนประเทศก่อนเปลี่ยนเส้นทางการค้นหาพิกัดภูมิศาสตร์ไปยังโดเมนดังกล่าว สําหรับการสนับสนุนด้านภูมิศาสตร์ตามประเทศ โปรดไปที่โพสต์นี้

บทสรุป

การใช้รหัสด้านบนจะช่วยให้คุณเข้ารหัสที่อยู่โดยใช้ Python , สร้าง KML <Placemark> จากต้นทาง และบันทึกลงในดิสก์ได้ หากคุณพบว่าคุณจําเป็นต้องกําหนดที่อยู่ IP ต่อวันให้มากกว่าขีดจํากัดที่อนุญาต หรือเครื่องมือจัดตารางเวลาของ Google ไม่ครอบคลุมภูมิภาคที่คุณสนใจ ให้ลองใช้บริการเว็บพิกัดภูมิศาสตร์เพิ่มเติม

เมื่อคุณทราบวิธีใส่รหัสภูมิศาสตร์แล้ว ให้อ่านบทความบทความเกี่ยวกับการใช้ KML ใน Google Mashup Editor และการใช้ PHP และ MySQL เพื่อสร้าง KML หากพบปัญหาหรือมีข้อสงสัยเกี่ยวกับบทแนะนํานี้ โปรดโพสต์ในฟอรัม Stack Overflow