this print for content only—size & color not accurate spine = 0.8927" 384 page count BOOKS FOR PROFESSIONALS BY PROFESSIONALS ® Michael Purvis US $34.99 Shelve in Web development User level: Beginner–Intermediate Purvis, Sambells, Turner THE EXPERT’S VOICE ® IN WEB DEVELOPMENT Michael Purvis, Jeffrey Sambells, and Cameron Turner Foreword by Mike Pegg, Founder of the Google Maps Mania Blog Beginning Google Maps Applications with PHP and Ajax From Novice to Professional CYAN MAGENTA YELLOW BLACK PANTONE 123 CV ISBN 1-59059-707-9 9 781590 597071 53499 6 89253 59707 1 Companion eBook Available Build awesome web-based mapping applications with this powerful API! Covers API Version 2, including Google’s geocoder! Covers API Version 2, including Google’s geocoder! www.apress.com SOURCE CODE ONLINE Companion eBook See last page for details on $10 eBook version forums.apress.com FOR PROFESSIONALS BY PROFESSIONALS ™ Join online discussions: THE APRESS ROADMAP Beginning JavaScript with DOM and Ajax Beginning CSS Web Development Pro CSS Techniques Beginning Google Maps Application Development with PHP and Ajax Beginning PHP and MySQL 5, Second Edition Jeffrey Sambells, ZCE Cameron Turner Beginning Google Maps Applications with PHP and Ajax: From Novice to Professional Dear Reader, Until recently, building interactive web-based mapping applications has been a cumbersome affair. That changed when Google released its powerful Maps API. We’ve written this book to help you take advantage of this technology in your own endeavors—whether you’re an enthusiast playing for fun or a professional building for profit. We get rolling with examples that require hardly any code at all, but you’ll quickly become acquainted with many facets of the Maps API. We demonstrate powerful methods for simultaneously plotting large data sets, creating your own map overlays, and harvesting and geocoding sets of addresses. You’ll see how to set up alternative tile sets and where to access imagery to use for them. We even show you how to build your own geocoder from scratch, for those high-volume batch jobs. We’ve had a blast researching and writing this book, and we really think it has turned into a great, comprehensive resource. As well as providing hands-on examples of real mapping projects, this book supplies a complete reference for the API, along with the relevant aspects of JavaScript, CSS, PHP, and SQL. If you enjoy this book or you’ve built something cool related to Google Maps, we encourage you to drop by http://googlemapsbook.com and let us know. We’re keeping a blog there that’s an ongoing stream of new pointers, ideas, and resources to help out fellow mappers. Now, go forth and map the world! Mike Purvis, Jeffrey Sambells, and Cameron Turner Beginning Google Maps Applications with PHP and Ajax Beginning Google Maps Applications with PHP and Ajax From Novice to Professional Michael Purvis Jeffrey Sambells and Cameron Turner 7079ch00FM.qxd 7/27/06 3:18 PM Page i Beginning Google Maps Applications with PHP and Ajax: From Novice to Professional Copyright © 2006 by Michael Purvis, Jeffrey Sambells, and Cameron Turner All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright owner and the publisher. ISBN-13 (pbk): 978-1-59059-707-1 ISBN-10 (pbk): 1-59059-707-9 Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1 Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark. Lead Editor: Jason Gilmore Technical Reviewer: Terrill Dent Editorial Board: Steve Anglin, Ewan Buckingham, Gary Cornell, Jason Gilmore, Jonathan Gennick, Jonathan Hassell, James Huddleston, Chris Mills, Matthew Moodie, Dominic Shakeshaft, Jim Sumser, Keir Thomas, Matt Wade Project Manager: Elizabeth Seymour Copy Edit Manager: Nicole LeClerc Copy Editor: Marilyn Smith Assistant Production Director: Kari Brooks-Copony Production Editor: Katie Stence Compositor: Kinetic Publishing Services, LLC Proofreader: Liz Welch Indexer: Beth Palmer Cover Designer: Kurt Krames Manufacturing Director: Tom Debolski Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail orders-ny@springer-sbm.com, or visit http://www.springeronline.com. For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley, CA 94710. Phone 510-549-5930, fax 510-549-5939, e-mail info@apress.com, or visit http://www.apress.com. The information in this book is distributed on an “as is” basis, without warranty. Although every precau- tion has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly by the information contained in this work. The source code for this book is available to readers at http://www.apress.com in the Source Code section or at the official book site, http://googlemapsbook.com. 7079ch00FM.qxd 7/27/06 3:18 PM Page ii To Anne and Jim, that with God’s grace, I might one day be so loving a parent. —Michael Purvis Dedicated to my loving wife, Stephanie, always by my side as my navigator in life. May we never lose our way in this crazy world. And also to my parents, Frank and Linda, who taught me to always look beyond the horizon. —Jeffrey Sambells I dedicate this book to my amazing wife, Tanya, and our son, Owen. Tanya is the ultimate teammate and life partner— always willing to dive into an adventure or opportunity regardless of the size. I’d also like to thank my parents, Barry and Lorna, for supporting me in all my ambitions and encouraging me to take risks and pursue dreams. Without all of you, I would never have agreed to write my first book about a moving-target topic such as Google Maps, on a compressed timeline, with a newborn baby! To everyone else who helped out in the last few months, thank you. We couldn’t have completed this book without your help and patience. —Cameron Turner 7079ch00FM.qxd 7/27/06 3:18 PM Page iii 7079ch00FM.qxd 7/27/06 3:18 PM Page iv Contents at a Glance Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii PART 1 ■ ■ ■ Your First Google Maps ■CHAPTER 1 Introducing Google Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 ■CHAPTER 2 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 ■CHAPTER 3 Interacting with the User and the Server . . . . . . . . . . . . . . . . . . . . . . . 31 ■CHAPTER 4 Geocoding Addresses. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 PART 2 ■ ■ ■ Beyond the Basics ■CHAPTER 5 Manipulating Third-Party Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 ■CHAPTER 6 Improving the User Interface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 ■CHAPTER 7 Optimizing and Scaling for Large Data Sets. . . . . . . . . . . . . . . . . . . . 145 ■CHAPTER 8 What’s Next for the Google Maps API?. . . . . . . . . . . . . . . . . . . . . . . . . 199 PART 3 ■ ■ ■ Advanced Map Features and Methods ■CHAPTER 9 Advanced Tips and Tricks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 ■CHAPTER 10 Lines, Lengths, and Areas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 ■CHAPTER 11 Advanced Geocoding Topics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 PART 4 ■ ■ ■ Appendixes ■APPENDIX A Finding the Data You Want . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 ■APPENDIX B Google Maps API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 ■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 v 7079ch00FM.qxd 7/27/06 3:18 PM Page v 7079ch00FM.qxd 7/27/06 3:18 PM Page vi Contents Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii PART 1 ■ ■ ■ Your First Google Maps ■CHAPTER 1 Introducing Google Maps. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 KML: Your First Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Wayfaring: Your Second Map. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Adding the First Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Adding the Flight Route . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Adding the Destination Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Adding a Driving Route . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 ■CHAPTER 2 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 The First Map. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Keying Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Examining the Sample Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Specifying a New Location. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Separating Code from Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Cleaning Up. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Basic Interaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Using Map Control Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Creating Markers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Opening Info Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 A List of Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Using Arrays and Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Iterating . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 vii 7079ch00FM.qxd 7/27/06 3:18 PM Page vii ■CHAPTER 3 Interacting with the User and the Server. . . . . . . . . . . . . . . . . . 31 Going on a Treasure Hunt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Creating the Map and Marking Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Starting the Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Listening to User Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Asking for More Information with an Info Window. . . . . . . . . . . . . . . . . . . . 37 Creating an Info Window on the Map . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Embedding a Form into the Info Window. . . . . . . . . . . . . . . . . . . . . . . 39 Avoiding an Ambiguous State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Controlling the Info Window Size. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Using Google’s Ajax Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 Saving Data with GXmlHttp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Parsing the XML Document Using DOM Methods . . . . . . . . . . . . . . . 54 Retrieving Markers from the Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Adding Some Flair. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 ■CHAPTER 4 Geocoding Addresses. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Creating an XML File with the Address Data. . . . . . . . . . . . . . . . . . . . . . . . . 63 Using Geocoding Web Services. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Requirements for Consuming Geocoding Services . . . . . . . . . . . . . . 66 The Google Maps API Geocoder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 The Yahoo Geocoding API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Geocoder.us . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 Geocoder.ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Services for Geocoding Addresses Outside Google’s Coverage. . . . 85 Caching Lookups. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Building a Store Location Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 PART 2 ■ ■ ■ Beyond the Basics ■CHAPTER 5 Manipulating Third-Party Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Using Downloadable Text Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Downloading the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Parsing CSV Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Optimizing the Import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Using Your New Database Schema. . . . . . . . . . . . . . . . . . . . . . . . . . . 106 ■CONTENTSviii 7079ch00FM.qxd 7/27/06 3:18 PM Page viii Screen Scraping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 A Scraping Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Screen Scraping Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 ■CHAPTER 6 Improving the User Interface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 CSS: A Touch of Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 Maximizing Your Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Adding Hovering Toolbars. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 Creating Collapsible Side Panels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 Scripted Style. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Switching Up the Body Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Resizing with the Power of JavaScript. . . . . . . . . . . . . . . . . . . . . . . . 129 Populating the Side Panel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 Getting Side Panel Feedback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Warning, Now Loading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 Data Point Filtering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 Showing and Hiding Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Discovering Groupings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Creating Filter Buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 ■CHAPTER 7 Optimizing and Scaling for Large Data Sets . . . . . . . . . . . . . 145 Understanding the Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 Streamlining Server-Client Communications . . . . . . . . . . . . . . . . . . . . . . . 146 Optimizing Server-Side Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 Server-Side Boundary Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Server-Side Common Point Method . . . . . . . . . . . . . . . . . . . . . . . . . . 155 Server-Side Clustering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Custom Detail Overlay Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Custom Tile Method. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 Optimizing the Client-Side User Experience . . . . . . . . . . . . . . . . . . . . . . . 186 Client-Side Boundary Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 Client-Side Closest to a Common Point Method. . . . . . . . . . . . . . . . 188 Client-Side Clustering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Further Optimizations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 ■CONTENTS ix 7079ch00FM.qxd 7/27/06 3:18 PM Page ix [...]... house from here” trend, and set the blogosphere abuzz with links to Google Maps locations around the world Like other mapping services, Google Maps offered directions, city and town mapping, and local business searches However, what the Google Maps engineers buried within its code was something that quickly set it apart from the rest Although unannounced and possibly unplanned, they provided the means to. .. when Google officially introduced the Google Maps API, which is the foundation for this book By releasing this API, Google allowed programmers the opportunity to build an endless array of applications on top of Google Maps Hundreds of API keys were registered immediately after the announcement, and many sites integrating Google Maps appeared within days The map mashup was born The Birth of the Google Maps. .. Google Maps service Sure, it’s just another mapping service Until you realize it’s full potential The ability to toggle between regular street/road maps and a satellite view is unreal I’ve started to see a lot of buzz around the blogging community about Google Maps so I’ve decided to help you keep up with the Google Maps related sites, blogs and tools that are cropping up Stay tuned Title: Google Sightseeing... impossible to keep up with all of them I liken this to the early days of the Web when search directories began to manually catalog new web pages as they came online The volume of new sites quickly became too huge to handle manually, and Google itself was born You can see why the Google Maps API offers the key for the next killer apps on the Web It has been the missing link to take the Web to the next... xmlns="http://www .google. com/earth/kml/2"> toronto.kml CN Tower The CN Tower (Canada's National Tower, Canadian National Tower), at 553.33 metres (1,815 ft., 5 inches) is the tallest freestanding structure on land It is located in the city of Toronto, Ontario, Canada, and is considered the signature icon of the city The CN Tower attracts close to two... visitors annually http://en.wikipedia.org/wiki/CN_Tower -79.386864,43.642426 In the actual file (located at http://googlemapsbook.com/chapter1/kml/toronto.kml), we included two more Placemark elements, which point to other well-known buildings in Toronto To view this on Google Maps, paste that URL into the Google. .. through 11) dives into advanced topics: building custom map overlays such as your own info window and tooltip, creating your own map tiles and projections, using the spherical equations necessary to calculate surface areas on the earth, and building your own geocoder from scratch Finally, one appendix provides a reference guide to the Google Maps version 2 API, and another points to a few places where... of Google Maps Mania for giving Apress our names when contacted about doing a book on Google Maps This book would not have been possible without his encouragement, support, generosity, and friendship Thanks to Terrill for finding the errors of our bleary-eyed coding sessions and helping make this book what it is today Thanks to Jason, Elizabeth, Marilyn, Katie, Julie, and the rest of the team at Apress. .. course of the coming chapters, you’re going to move from simple tasks involving markers and geocoding to more advanced topics, such as how to acquire data, present many data points, and provide a useful and attractive user interface A lot of important web technologies and patterns have emerged in parallel with the Google Maps API But whether you call it Ajax or Web 2.0 is less important than what it... first Google Maps related site of note is Google Sightseeing This blog tracks interesting satellite shots as submitted by its visitors, then organizes them by interest area like buildings, natural landmarks and stadiums It’s a pretty nifty site Google Sightseeing even posted my suggestion of Toronto’s Rogers Centre (Skydome) and the CN Tower! Title: Flickr Memory Maps Here’s a Flickr group that took . Sambells, and Cameron Turner Beginning Google Maps Applications with PHP and Ajax Beginning Google Maps Applications with PHP and Ajax From Novice to Professional Michael Purvis Jeffrey Sambells and. Google Maps Application Development with PHP and Ajax Beginning PHP and MySQL 5, Second Edition Jeffrey Sambells, ZCE Cameron Turner Beginning Google Maps Applications with PHP and Ajax: From Novice. Sambells, and Cameron Turner Foreword by Mike Pegg, Founder of the Google Maps Mania Blog Beginning Google Maps Applications with PHP and Ajax From Novice to Professional CYAN MAGENTA YELLOW BLACK PANTONE