ผู้เขียน: ธันวาคม 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 รองรับในภาษาการจัดโปรแกรมส่วนใหญ่ ขั้นตอนนี้จึงง่ายในการย้ายไปยังภาษาโปรแกรมอื่น มีขั้นตอนดังนี้
- สร้างเอกสารโดยใช้
xml.dom.minidom.Document()
ของ Python - สร้างเอลิเมนต์
<kml>
ระดับรูทโดยใช้createElementNS.
- ต่อท้ายเอกสารโดยใช้
appendChild
- สร้างองค์ประกอบเอกสารโดยใช้
createElement
- ต่อท้ายองค์ประกอบ
<kml>
โดยใช้appendChild
- สําหรับแต่ละอีเมล ให้สร้างองค์ประกอบ
<Placemark>
โดยใช้createElement
และต่อท้ายองค์ประกอบDocument
จากนั้นสร้างเอลิเมนต์<description>
กําหนดค่าของที่อยู่ แล้วนําไปต่อท้ายองค์ประกอบ<Placemark>
- สร้างเอลิเมนต์
<Point>
เพิ่มเอลิเมนต์<coordinates>
ย่อย แล้วต่อท้ายเอลิเมนต์<Placemark>
- ส่งที่อยู่ไปยัง Maps API Geocoder ซึ่งจะส่งคําตอบในรูปแบบ JSON หรือ XML
ใช้
urllib.urlopen()
เพื่อเรียกข้อมูลไฟล์และอ่านเป็นสตริง - แยกวิเคราะห์การตอบสนองและดึงองค์ประกอบลองจิจูดและละติจูด
- สร้างโหนดข้อความในองค์ประกอบ
<coordinates>
และกําหนดสตริงลองจิจูด/ละติจูดเป็นค่าของโหนด - เขียนเอกสาร 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 aelement. 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