| # -*- coding: utf-8 -*- | |
| # | |
| # Copyright 2014 Google Inc. All Rights Reserved. | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| """Simple command-line sample for Google Maps Engine. | |
| This sample code demonstrates use of the Google Maps Engine API. For more | |
| information on the API, see developers.google.com/maps-engine/documentation/ | |
| These samples allow you to | |
| 1) List projects you have access to | |
| 2) List tables in a given project. | |
| 3) Upload a shapefile to create a Table asset. | |
| Usage: | |
| $ python maps_engine.py [-p project_id] [-s shapefile] | |
| If you do not enter a shapefile, it will upload the included "polygons". | |
| You can also get help on all the command-line flags the program understands | |
| by running: | |
| $ python maps_engine.py --help | |
| To get detailed log output run: | |
| $ python maps_engine.py -p 123456 --logging_level=DEBUG | |
| """ | |
| __author__ = "[email protected] (Josh Livni)" | |
| import argparse | |
| import json | |
| import logging | |
| import sys | |
| import time | |
| from apiclient import sample_tools | |
| from apiclient.http import MediaFileUpload | |
| logging.basicConfig(level=logging.INFO) | |
| # Declare command-line flags. | |
| argparser = argparse.ArgumentParser(add_help=False) | |
| argparser.add_argument("-p", "--project_id", help="optional GME Project ID") | |
| argparser.add_argument("-s", "--shapefile", help="Shapefile (without the .shp)") | |
| SUCCESSFUL_STATUS = ["processed", "complete", "ready"] | |
| class MapsEngineSampleException(Exception): | |
| """Catch this for failures specific to this sample code.""" | |
| def ListProjects(service): | |
| """List the projects available to the authorized account. | |
| Args: | |
| service: The service object built by the Google API Python client library. | |
| """ | |
| projects = service.projects().list().execute() | |
| logging.info(json.dumps(projects, indent=2)) | |
| def ListTables(service, project_id): | |
| """List the tables in a given project. | |
| Args: | |
| service: The service object built by the Google API Python client library. | |
| project_id: string, id of the GME project. | |
| """ | |
| tables = service.tables().list(projectId=project_id).execute() | |
| logging.info(json.dumps(tables, indent=2)) | |
| def UploadShapefile(service, project_id, shapefile_prefix): | |
| """Upload a shapefile to a given project, and display status when complete. | |
| Args: | |
| service: The service object built by the Google API Python client library. | |
| project_id: string, id of the GME project. | |
| shapefile_prefix: string, the shapefile without the .shp suffix. | |
| Returns: | |
| String id of the table asset. | |
| """ | |
| # A shapefile is actually a bunch of files; GME requires these four suffixes. | |
| suffixes = ["shp", "dbf", "prj", "shx"] | |
| files = [] | |
| for suffix in suffixes: | |
| files.append({ | |
| "filename": "%s.%s" % (shapefile_prefix, suffix) | |
| }) | |
| metadata = { | |
| "projectId": project_id, | |
| "name": shapefile_prefix, | |
| "description": "polygons that were uploaded by a script", | |
| "files": files, | |
| # You need the string value of a valid shared and published ACL | |
| # Check the "Access Lists" section of the Maps Engine UI for a list. | |
| "draftAccessList": "Map Editors", | |
| "tags": [shapefile_prefix, "auto_upload", "kittens"] | |
| } | |
| logging.info("Uploading metadata for %s", shapefile_prefix) | |
| response = service.tables().upload(body=metadata).execute() | |
| # We have now created an empty asset. | |
| table_id = response["id"] | |
| # And now upload each of the files individually, passing in the table id. | |
| for suffix in suffixes: | |
| shapefile = "%s.%s" % (shapefile_prefix, suffix) | |
| media_body = MediaFileUpload(shapefile, mimetype="application/octet-stream") | |
| logging.info("uploading %s", shapefile) | |
| response = service.tables().files().insert( | |
| id=table_id, | |
| filename=shapefile, | |
| media_body=media_body).execute() | |
| # With all files uploaded, check status of the asset to ensure it's processed. | |
| CheckAssetStatus(service, "tables", table_id) | |
| return table_id | |
| def CheckAssetStatus(service, asset_type, asset_id): | |
| endpoint = getattr(service, asset_type) | |
| response = endpoint().get(id=asset_id).execute() | |
| status = response["processingStatus"] | |
| logging.info("Asset Status: %s", status) | |
| if status in SUCCESSFUL_STATUS: | |
| logging.info("asset successfully processed; the id is %s", asset_id) | |
| else: | |
| logging.info("Asset %s; will check again in 5 seconds", status) | |
| time.sleep(5) | |
| CheckAssetStatus(service, asset_type, asset_id) | |
| def main(argv): | |
| # Authenticate and construct service. | |
| service, flags = sample_tools.init( | |
| argv, "mapsengine", "v1", __doc__, __file__, parents=[argparser], | |
| scope="https://www.googleapis.com/auth/mapsengine") | |
| if flags.project_id: | |
| # ListTables(service, flags.project_id) | |
| # The example polygons shapefile should be in this directory. | |
| filename = flags.shapefile or "polygons" | |
| table_id = UploadShapefile(service, flags.project_id, filename) | |
| logging.info("Sucessfully created table: %s", table_id) | |
| else: | |
| ListProjects(service) | |
| return | |
| if __name__ == "__main__": | |
| main(sys.argv) |