python route guide - just the code
This commit is contained in:
parent
ad232444df
commit
460a449742
|
|
@ -0,0 +1 @@
|
||||||
|
*.pyc
|
||||||
|
|
@ -0,0 +1,119 @@
|
||||||
|
// Copyright 2015, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
syntax = "proto2";
|
||||||
|
|
||||||
|
//TODO: see https://github.com/grpc/grpc/issues/814
|
||||||
|
//package examples;
|
||||||
|
|
||||||
|
// Interface exported by the server.
|
||||||
|
service RouteGuide {
|
||||||
|
// A simple RPC.
|
||||||
|
//
|
||||||
|
// Obtains the feature at a given position.
|
||||||
|
rpc GetFeature(Point) returns (Feature) {}
|
||||||
|
|
||||||
|
// A server-to-client streaming RPC.
|
||||||
|
//
|
||||||
|
// Obtains the Features available within the given Rectangle. Results are
|
||||||
|
// streamed rather than returned at once (e.g. in a response message with a
|
||||||
|
// repeated field), as the rectangle may cover a large area and contain a
|
||||||
|
// huge number of features.
|
||||||
|
rpc ListFeatures(Rectangle) returns (stream Feature) {}
|
||||||
|
|
||||||
|
// A client-to-server streaming RPC.
|
||||||
|
//
|
||||||
|
// Accepts a stream of Points on a route being traversed, returning a
|
||||||
|
// RouteSummary when traversal is completed.
|
||||||
|
rpc RecordRoute(stream Point) returns (RouteSummary) {}
|
||||||
|
|
||||||
|
// A Bidirectional streaming RPC.
|
||||||
|
//
|
||||||
|
// Accepts a stream of RouteNotes sent while a route is being traversed,
|
||||||
|
// while receiving other RouteNotes (e.g. from other users).
|
||||||
|
rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Points are represented as latitude-longitude pairs in the E7 representation
|
||||||
|
// (degrees multiplied by 10**7 and rounded to the nearest integer).
|
||||||
|
// Latitudes should be in the range +/- 90 degrees and longitude should be in
|
||||||
|
// the range +/- 180 degrees (inclusive).
|
||||||
|
message Point {
|
||||||
|
optional int32 latitude = 1;
|
||||||
|
optional int32 longitude = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A latitude-longitude rectangle, represented as two diagonally opposite
|
||||||
|
// points "lo" and "hi".
|
||||||
|
message Rectangle {
|
||||||
|
// One corner of the rectangle.
|
||||||
|
optional Point lo = 1;
|
||||||
|
|
||||||
|
// The other corner of the rectangle.
|
||||||
|
optional Point hi = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A feature names something at a given point.
|
||||||
|
//
|
||||||
|
// If a feature could not be named, the name is empty.
|
||||||
|
message Feature {
|
||||||
|
// The name of the feature.
|
||||||
|
optional string name = 1;
|
||||||
|
|
||||||
|
// The point where the feature is detected.
|
||||||
|
optional Point location = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A RouteNote is a message sent while at a given point.
|
||||||
|
message RouteNote {
|
||||||
|
// The location from which the message is sent.
|
||||||
|
optional Point location = 1;
|
||||||
|
|
||||||
|
// The message to be sent.
|
||||||
|
optional string message = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A RouteSummary is received in response to a RecordRoute rpc.
|
||||||
|
//
|
||||||
|
// It contains the number of individual points received, the number of
|
||||||
|
// detected features, and the total distance covered as the cumulative sum of
|
||||||
|
// the distance between each point.
|
||||||
|
message RouteSummary {
|
||||||
|
// The number of points received.
|
||||||
|
optional int32 point_count = 1;
|
||||||
|
|
||||||
|
// The number of known features passed while traversing the route.
|
||||||
|
optional int32 feature_count = 2;
|
||||||
|
|
||||||
|
// The distance covered in metres.
|
||||||
|
optional int32 distance = 3;
|
||||||
|
|
||||||
|
// The duration of the traversal in seconds.
|
||||||
|
optional int32 elapsed_time = 4;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,143 @@
|
||||||
|
# Copyright 2015, Google Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are
|
||||||
|
# met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above
|
||||||
|
# copyright notice, this list of conditions and the following disclaimer
|
||||||
|
# in the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
# * Neither the name of Google Inc. nor the names of its
|
||||||
|
# contributors may be used to endorse or promote products derived from
|
||||||
|
# this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
"""The Python implementation of the gRPC route guide client."""
|
||||||
|
|
||||||
|
import route_guide_pb2
|
||||||
|
|
||||||
|
import json
|
||||||
|
import random
|
||||||
|
import time
|
||||||
|
|
||||||
|
_TIMEOUT_SECONDS = 30
|
||||||
|
|
||||||
|
|
||||||
|
def read_route_guide_db():
|
||||||
|
"""Reads the route guide"""
|
||||||
|
feature_list = []
|
||||||
|
with open("route_guide_db.json") as route_guide_db_file:
|
||||||
|
for item in json.load(route_guide_db_file):
|
||||||
|
feature = route_guide_pb2.Feature(name=item["name"])
|
||||||
|
feature.location.longitude = item["location"]["longitude"]
|
||||||
|
feature.location.latitude = item["location"]["latitude"]
|
||||||
|
feature_list.append(feature)
|
||||||
|
return feature_list
|
||||||
|
|
||||||
|
|
||||||
|
def make_route_note(message, latitude, longitude):
|
||||||
|
route_note = route_guide_pb2.RouteNote(message=message)
|
||||||
|
route_note.location.latitude = latitude
|
||||||
|
route_note.location.longitude = longitude
|
||||||
|
return route_note
|
||||||
|
|
||||||
|
|
||||||
|
def guide_get_one_feature(stub, point):
|
||||||
|
feature = stub.GetFeature(point, _TIMEOUT_SECONDS)
|
||||||
|
if not feature.location:
|
||||||
|
print "Server returned incomplete feature"
|
||||||
|
return
|
||||||
|
|
||||||
|
if feature.name:
|
||||||
|
print "Feature called %s at %s" % (feature.name, feature.location)
|
||||||
|
else:
|
||||||
|
print "Found no feature at %s" % feature.location
|
||||||
|
|
||||||
|
|
||||||
|
def guide_get_feature(stub):
|
||||||
|
guide_get_one_feature(stub, route_guide_pb2.Point(latitude=409146138, longitude=-746188906))
|
||||||
|
guide_get_one_feature(stub, route_guide_pb2.Point(latitude=0, longitude=0))
|
||||||
|
|
||||||
|
|
||||||
|
def guide_list_features(stub):
|
||||||
|
rect = route_guide_pb2.Rectangle()
|
||||||
|
rect.lo.latitude = 400000000
|
||||||
|
rect.lo.longitude = -750000000
|
||||||
|
rect.hi.latitude = 420000000
|
||||||
|
rect.hi.longitude = -730000000
|
||||||
|
print "Looking for features between 40, -75 and 42, -73"
|
||||||
|
|
||||||
|
features = stub.ListFeatures(rect, _TIMEOUT_SECONDS)
|
||||||
|
|
||||||
|
for feature in features:
|
||||||
|
print "Feature called %s at %s" % (feature.name, feature.location)
|
||||||
|
|
||||||
|
|
||||||
|
def generate_route(feature_list):
|
||||||
|
for index in range(0, 10):
|
||||||
|
random_feature = feature_list[random.randint(0, len(feature_list) - 1)]
|
||||||
|
print "Visiting point %s" % random_feature.location
|
||||||
|
yield random_feature.location
|
||||||
|
time.sleep(random.uniform(0.5, 1.5))
|
||||||
|
|
||||||
|
|
||||||
|
def guide_record_route(stub):
|
||||||
|
feature_list = read_route_guide_db()
|
||||||
|
|
||||||
|
route_iter = generate_route(feature_list)
|
||||||
|
route_summary = stub.RecordRoute(route_iter, _TIMEOUT_SECONDS)
|
||||||
|
print "Finished trip with %s points " % route_summary.point_count
|
||||||
|
print "Passed %s features " % route_summary.feature_count
|
||||||
|
print "Travelled %s meters " % route_summary.distance
|
||||||
|
print "It took %s seconds " % route_summary.elapsed_time
|
||||||
|
|
||||||
|
|
||||||
|
def generate_messages():
|
||||||
|
messages = [
|
||||||
|
make_route_note("First message", 0, 0),
|
||||||
|
make_route_note("Second message", 0, 1),
|
||||||
|
make_route_note("Third message", 1, 0),
|
||||||
|
make_route_note("Fourth message", 0, 0),
|
||||||
|
make_route_note("Fifth message", 1, 0),
|
||||||
|
]
|
||||||
|
for msg in messages:
|
||||||
|
print "Sending %s at %s" % (msg.message, msg.location)
|
||||||
|
yield msg
|
||||||
|
time.sleep(random.uniform(0.5, 1.0))
|
||||||
|
|
||||||
|
|
||||||
|
def guide_route_chat(stub):
|
||||||
|
responses = stub.RouteChat(generate_messages(), _TIMEOUT_SECONDS)
|
||||||
|
for response in responses:
|
||||||
|
print "Received message %s at %s" % (response.message, response.location)
|
||||||
|
|
||||||
|
|
||||||
|
def run():
|
||||||
|
with route_guide_pb2.early_adopter_create_RouteGuide_stub('localhost', 50051) as stub:
|
||||||
|
print "-------------- GetFeature --------------"
|
||||||
|
guide_get_feature(stub);
|
||||||
|
print "-------------- ListFeatures --------------"
|
||||||
|
guide_list_features(stub);
|
||||||
|
print "-------------- RecordRoute --------------"
|
||||||
|
guide_record_route(stub);
|
||||||
|
print "-------------- RouteChat --------------"
|
||||||
|
guide_route_chat(stub);
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
run()
|
||||||
|
|
@ -0,0 +1,601 @@
|
||||||
|
[{
|
||||||
|
"location": {
|
||||||
|
"latitude": 407838351,
|
||||||
|
"longitude": -746143763
|
||||||
|
},
|
||||||
|
"name": "Patriots Path, Mendham, NJ 07945, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 408122808,
|
||||||
|
"longitude": -743999179
|
||||||
|
},
|
||||||
|
"name": "101 New Jersey 10, Whippany, NJ 07981, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 413628156,
|
||||||
|
"longitude": -749015468
|
||||||
|
},
|
||||||
|
"name": "U.S. 6, Shohola, PA 18458, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 419999544,
|
||||||
|
"longitude": -740371136
|
||||||
|
},
|
||||||
|
"name": "5 Conners Road, Kingston, NY 12401, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 414008389,
|
||||||
|
"longitude": -743951297
|
||||||
|
},
|
||||||
|
"name": "Mid Hudson Psychiatric Center, New Hampton, NY 10958, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 419611318,
|
||||||
|
"longitude": -746524769
|
||||||
|
},
|
||||||
|
"name": "287 Flugertown Road, Livingston Manor, NY 12758, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 406109563,
|
||||||
|
"longitude": -742186778
|
||||||
|
},
|
||||||
|
"name": "4001 Tremley Point Road, Linden, NJ 07036, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 416802456,
|
||||||
|
"longitude": -742370183
|
||||||
|
},
|
||||||
|
"name": "352 South Mountain Road, Wallkill, NY 12589, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 412950425,
|
||||||
|
"longitude": -741077389
|
||||||
|
},
|
||||||
|
"name": "Bailey Turn Road, Harriman, NY 10926, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 412144655,
|
||||||
|
"longitude": -743949739
|
||||||
|
},
|
||||||
|
"name": "193-199 Wawayanda Road, Hewitt, NJ 07421, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 415736605,
|
||||||
|
"longitude": -742847522
|
||||||
|
},
|
||||||
|
"name": "406-496 Ward Avenue, Pine Bush, NY 12566, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 413843930,
|
||||||
|
"longitude": -740501726
|
||||||
|
},
|
||||||
|
"name": "162 Merrill Road, Highland Mills, NY 10930, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 410873075,
|
||||||
|
"longitude": -744459023
|
||||||
|
},
|
||||||
|
"name": "Clinton Road, West Milford, NJ 07480, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 412346009,
|
||||||
|
"longitude": -744026814
|
||||||
|
},
|
||||||
|
"name": "16 Old Brook Lane, Warwick, NY 10990, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 402948455,
|
||||||
|
"longitude": -747903913
|
||||||
|
},
|
||||||
|
"name": "3 Drake Lane, Pennington, NJ 08534, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 406337092,
|
||||||
|
"longitude": -740122226
|
||||||
|
},
|
||||||
|
"name": "6324 8th Avenue, Brooklyn, NY 11220, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 406421967,
|
||||||
|
"longitude": -747727624
|
||||||
|
},
|
||||||
|
"name": "1 Merck Access Road, Whitehouse Station, NJ 08889, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 416318082,
|
||||||
|
"longitude": -749677716
|
||||||
|
},
|
||||||
|
"name": "78-98 Schalck Road, Narrowsburg, NY 12764, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 415301720,
|
||||||
|
"longitude": -748416257
|
||||||
|
},
|
||||||
|
"name": "282 Lakeview Drive Road, Highland Lake, NY 12743, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 402647019,
|
||||||
|
"longitude": -747071791
|
||||||
|
},
|
||||||
|
"name": "330 Evelyn Avenue, Hamilton Township, NJ 08619, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 412567807,
|
||||||
|
"longitude": -741058078
|
||||||
|
},
|
||||||
|
"name": "New York State Reference Route 987E, Southfields, NY 10975, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 416855156,
|
||||||
|
"longitude": -744420597
|
||||||
|
},
|
||||||
|
"name": "103-271 Tempaloni Road, Ellenville, NY 12428, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 404663628,
|
||||||
|
"longitude": -744820157
|
||||||
|
},
|
||||||
|
"name": "1300 Airport Road, North Brunswick Township, NJ 08902, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 407113723,
|
||||||
|
"longitude": -749746483
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 402133926,
|
||||||
|
"longitude": -743613249
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 400273442,
|
||||||
|
"longitude": -741220915
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 411236786,
|
||||||
|
"longitude": -744070769
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 411633782,
|
||||||
|
"longitude": -746784970
|
||||||
|
},
|
||||||
|
"name": "211-225 Plains Road, Augusta, NJ 07822, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 415830701,
|
||||||
|
"longitude": -742952812
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 413447164,
|
||||||
|
"longitude": -748712898
|
||||||
|
},
|
||||||
|
"name": "165 Pedersen Ridge Road, Milford, PA 18337, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 405047245,
|
||||||
|
"longitude": -749800722
|
||||||
|
},
|
||||||
|
"name": "100-122 Locktown Road, Frenchtown, NJ 08825, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 418858923,
|
||||||
|
"longitude": -746156790
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 417951888,
|
||||||
|
"longitude": -748484944
|
||||||
|
},
|
||||||
|
"name": "650-652 Willi Hill Road, Swan Lake, NY 12783, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 407033786,
|
||||||
|
"longitude": -743977337
|
||||||
|
},
|
||||||
|
"name": "26 East 3rd Street, New Providence, NJ 07974, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 417548014,
|
||||||
|
"longitude": -740075041
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 410395868,
|
||||||
|
"longitude": -744972325
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 404615353,
|
||||||
|
"longitude": -745129803
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 406589790,
|
||||||
|
"longitude": -743560121
|
||||||
|
},
|
||||||
|
"name": "611 Lawrence Avenue, Westfield, NJ 07090, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 414653148,
|
||||||
|
"longitude": -740477477
|
||||||
|
},
|
||||||
|
"name": "18 Lannis Avenue, New Windsor, NY 12553, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 405957808,
|
||||||
|
"longitude": -743255336
|
||||||
|
},
|
||||||
|
"name": "82-104 Amherst Avenue, Colonia, NJ 07067, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 411733589,
|
||||||
|
"longitude": -741648093
|
||||||
|
},
|
||||||
|
"name": "170 Seven Lakes Drive, Sloatsburg, NY 10974, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 412676291,
|
||||||
|
"longitude": -742606606
|
||||||
|
},
|
||||||
|
"name": "1270 Lakes Road, Monroe, NY 10950, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 409224445,
|
||||||
|
"longitude": -748286738
|
||||||
|
},
|
||||||
|
"name": "509-535 Alphano Road, Great Meadows, NJ 07838, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 406523420,
|
||||||
|
"longitude": -742135517
|
||||||
|
},
|
||||||
|
"name": "652 Garden Street, Elizabeth, NJ 07202, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 401827388,
|
||||||
|
"longitude": -740294537
|
||||||
|
},
|
||||||
|
"name": "349 Sea Spray Court, Neptune City, NJ 07753, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 410564152,
|
||||||
|
"longitude": -743685054
|
||||||
|
},
|
||||||
|
"name": "13-17 Stanley Street, West Milford, NJ 07480, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 408472324,
|
||||||
|
"longitude": -740726046
|
||||||
|
},
|
||||||
|
"name": "47 Industrial Avenue, Teterboro, NJ 07608, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 412452168,
|
||||||
|
"longitude": -740214052
|
||||||
|
},
|
||||||
|
"name": "5 White Oak Lane, Stony Point, NY 10980, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 409146138,
|
||||||
|
"longitude": -746188906
|
||||||
|
},
|
||||||
|
"name": "Berkshire Valley Management Area Trail, Jefferson, NJ, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 404701380,
|
||||||
|
"longitude": -744781745
|
||||||
|
},
|
||||||
|
"name": "1007 Jersey Avenue, New Brunswick, NJ 08901, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 409642566,
|
||||||
|
"longitude": -746017679
|
||||||
|
},
|
||||||
|
"name": "6 East Emerald Isle Drive, Lake Hopatcong, NJ 07849, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 408031728,
|
||||||
|
"longitude": -748645385
|
||||||
|
},
|
||||||
|
"name": "1358-1474 New Jersey 57, Port Murray, NJ 07865, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 413700272,
|
||||||
|
"longitude": -742135189
|
||||||
|
},
|
||||||
|
"name": "367 Prospect Road, Chester, NY 10918, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 404310607,
|
||||||
|
"longitude": -740282632
|
||||||
|
},
|
||||||
|
"name": "10 Simon Lake Drive, Atlantic Highlands, NJ 07716, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 409319800,
|
||||||
|
"longitude": -746201391
|
||||||
|
},
|
||||||
|
"name": "11 Ward Street, Mount Arlington, NJ 07856, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 406685311,
|
||||||
|
"longitude": -742108603
|
||||||
|
},
|
||||||
|
"name": "300-398 Jefferson Avenue, Elizabeth, NJ 07201, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 419018117,
|
||||||
|
"longitude": -749142781
|
||||||
|
},
|
||||||
|
"name": "43 Dreher Road, Roscoe, NY 12776, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 412856162,
|
||||||
|
"longitude": -745148837
|
||||||
|
},
|
||||||
|
"name": "Swan Street, Pine Island, NY 10969, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 416560744,
|
||||||
|
"longitude": -746721964
|
||||||
|
},
|
||||||
|
"name": "66 Pleasantview Avenue, Monticello, NY 12701, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 405314270,
|
||||||
|
"longitude": -749836354
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 414219548,
|
||||||
|
"longitude": -743327440
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 415534177,
|
||||||
|
"longitude": -742900616
|
||||||
|
},
|
||||||
|
"name": "565 Winding Hills Road, Montgomery, NY 12549, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 406898530,
|
||||||
|
"longitude": -749127080
|
||||||
|
},
|
||||||
|
"name": "231 Rocky Run Road, Glen Gardner, NJ 08826, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 407586880,
|
||||||
|
"longitude": -741670168
|
||||||
|
},
|
||||||
|
"name": "100 Mount Pleasant Avenue, Newark, NJ 07104, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 400106455,
|
||||||
|
"longitude": -742870190
|
||||||
|
},
|
||||||
|
"name": "517-521 Huntington Drive, Manchester Township, NJ 08759, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 400066188,
|
||||||
|
"longitude": -746793294
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 418803880,
|
||||||
|
"longitude": -744102673
|
||||||
|
},
|
||||||
|
"name": "40 Mountain Road, Napanoch, NY 12458, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 414204288,
|
||||||
|
"longitude": -747895140
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 414777405,
|
||||||
|
"longitude": -740615601
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 415464475,
|
||||||
|
"longitude": -747175374
|
||||||
|
},
|
||||||
|
"name": "48 North Road, Forestburgh, NY 12777, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 404062378,
|
||||||
|
"longitude": -746376177
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 405688272,
|
||||||
|
"longitude": -749285130
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 400342070,
|
||||||
|
"longitude": -748788996
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 401809022,
|
||||||
|
"longitude": -744157964
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 404226644,
|
||||||
|
"longitude": -740517141
|
||||||
|
},
|
||||||
|
"name": "9 Thompson Avenue, Leonardo, NJ 07737, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 410322033,
|
||||||
|
"longitude": -747871659
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 407100674,
|
||||||
|
"longitude": -747742727
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 418811433,
|
||||||
|
"longitude": -741718005
|
||||||
|
},
|
||||||
|
"name": "213 Bush Road, Stone Ridge, NY 12484, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 415034302,
|
||||||
|
"longitude": -743850945
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 411349992,
|
||||||
|
"longitude": -743694161
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 404839914,
|
||||||
|
"longitude": -744759616
|
||||||
|
},
|
||||||
|
"name": "1-17 Bergen Court, New Brunswick, NJ 08901, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 414638017,
|
||||||
|
"longitude": -745957854
|
||||||
|
},
|
||||||
|
"name": "35 Oakland Valley Road, Cuddebackville, NY 12729, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 412127800,
|
||||||
|
"longitude": -740173578
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 401263460,
|
||||||
|
"longitude": -747964303
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 412843391,
|
||||||
|
"longitude": -749086026
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 418512773,
|
||||||
|
"longitude": -743067823
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 404318328,
|
||||||
|
"longitude": -740835638
|
||||||
|
},
|
||||||
|
"name": "42-102 Main Street, Belford, NJ 07718, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 419020746,
|
||||||
|
"longitude": -741172328
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 404080723,
|
||||||
|
"longitude": -746119569
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 401012643,
|
||||||
|
"longitude": -744035134
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 404306372,
|
||||||
|
"longitude": -741079661
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 403966326,
|
||||||
|
"longitude": -748519297
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 405002031,
|
||||||
|
"longitude": -748407866
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 409532885,
|
||||||
|
"longitude": -742200683
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 416851321,
|
||||||
|
"longitude": -742674555
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 406411633,
|
||||||
|
"longitude": -741722051
|
||||||
|
},
|
||||||
|
"name": "3387 Richmond Terrace, Staten Island, NY 10303, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 413069058,
|
||||||
|
"longitude": -744597778
|
||||||
|
},
|
||||||
|
"name": "261 Van Sickle Road, Goshen, NY 10924, USA"
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 418465462,
|
||||||
|
"longitude": -746859398
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 411733222,
|
||||||
|
"longitude": -744228360
|
||||||
|
},
|
||||||
|
"name": ""
|
||||||
|
}, {
|
||||||
|
"location": {
|
||||||
|
"latitude": 410248224,
|
||||||
|
"longitude": -747127767
|
||||||
|
},
|
||||||
|
"name": "3 Hasta Way, Newton, NJ 07860, USA"
|
||||||
|
}]
|
||||||
|
|
@ -0,0 +1,370 @@
|
||||||
|
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||||
|
# source: route_guide.proto
|
||||||
|
|
||||||
|
import sys
|
||||||
|
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
|
||||||
|
from google.protobuf import descriptor as _descriptor
|
||||||
|
from google.protobuf import message as _message
|
||||||
|
from google.protobuf import reflection as _reflection
|
||||||
|
from google.protobuf import symbol_database as _symbol_database
|
||||||
|
from google.protobuf import descriptor_pb2
|
||||||
|
# @@protoc_insertion_point(imports)
|
||||||
|
|
||||||
|
_sym_db = _symbol_database.Default()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DESCRIPTOR = _descriptor.FileDescriptor(
|
||||||
|
name='route_guide.proto',
|
||||||
|
package='',
|
||||||
|
serialized_pb=_b('\n\x11route_guide.proto\",\n\x05Point\x12\x10\n\x08latitude\x18\x01 \x01(\x05\x12\x11\n\tlongitude\x18\x02 \x01(\x05\"3\n\tRectangle\x12\x12\n\x02lo\x18\x01 \x01(\x0b\x32\x06.Point\x12\x12\n\x02hi\x18\x02 \x01(\x0b\x32\x06.Point\"1\n\x07\x46\x65\x61ture\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x08location\x18\x02 \x01(\x0b\x32\x06.Point\"6\n\tRouteNote\x12\x18\n\x08location\x18\x01 \x01(\x0b\x32\x06.Point\x12\x0f\n\x07message\x18\x02 \x01(\t\"b\n\x0cRouteSummary\x12\x13\n\x0bpoint_count\x18\x01 \x01(\x05\x12\x15\n\rfeature_count\x18\x02 \x01(\x05\x12\x10\n\x08\x64istance\x18\x03 \x01(\x05\x12\x14\n\x0c\x65lapsed_time\x18\x04 \x01(\x05\x32\xad\x01\n\nRouteGuide\x12 \n\nGetFeature\x12\x06.Point\x1a\x08.Feature\"\x00\x12(\n\x0cListFeatures\x12\n.Rectangle\x1a\x08.Feature\"\x00\x30\x01\x12(\n\x0bRecordRoute\x12\x06.Point\x1a\r.RouteSummary\"\x00(\x01\x12)\n\tRouteChat\x12\n.RouteNote\x1a\n.RouteNote\"\x00(\x01\x30\x01')
|
||||||
|
)
|
||||||
|
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_POINT = _descriptor.Descriptor(
|
||||||
|
name='Point',
|
||||||
|
full_name='Point',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='latitude', full_name='Point.latitude', index=0,
|
||||||
|
number=1, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
options=None),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='longitude', full_name='Point.longitude', index=1,
|
||||||
|
number=2, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
options=None),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=21,
|
||||||
|
serialized_end=65,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_RECTANGLE = _descriptor.Descriptor(
|
||||||
|
name='Rectangle',
|
||||||
|
full_name='Rectangle',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='lo', full_name='Rectangle.lo', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
options=None),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='hi', full_name='Rectangle.hi', index=1,
|
||||||
|
number=2, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
options=None),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=67,
|
||||||
|
serialized_end=118,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_FEATURE = _descriptor.Descriptor(
|
||||||
|
name='Feature',
|
||||||
|
full_name='Feature',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='name', full_name='Feature.name', index=0,
|
||||||
|
number=1, type=9, cpp_type=9, label=1,
|
||||||
|
has_default_value=False, default_value=_b("").decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
options=None),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='location', full_name='Feature.location', index=1,
|
||||||
|
number=2, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
options=None),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=120,
|
||||||
|
serialized_end=169,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_ROUTENOTE = _descriptor.Descriptor(
|
||||||
|
name='RouteNote',
|
||||||
|
full_name='RouteNote',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='location', full_name='RouteNote.location', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
options=None),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='message', full_name='RouteNote.message', index=1,
|
||||||
|
number=2, type=9, cpp_type=9, label=1,
|
||||||
|
has_default_value=False, default_value=_b("").decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
options=None),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=171,
|
||||||
|
serialized_end=225,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_ROUTESUMMARY = _descriptor.Descriptor(
|
||||||
|
name='RouteSummary',
|
||||||
|
full_name='RouteSummary',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='point_count', full_name='RouteSummary.point_count', index=0,
|
||||||
|
number=1, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
options=None),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='feature_count', full_name='RouteSummary.feature_count', index=1,
|
||||||
|
number=2, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
options=None),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='distance', full_name='RouteSummary.distance', index=2,
|
||||||
|
number=3, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
options=None),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='elapsed_time', full_name='RouteSummary.elapsed_time', index=3,
|
||||||
|
number=4, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
options=None),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=227,
|
||||||
|
serialized_end=325,
|
||||||
|
)
|
||||||
|
|
||||||
|
_RECTANGLE.fields_by_name['lo'].message_type = _POINT
|
||||||
|
_RECTANGLE.fields_by_name['hi'].message_type = _POINT
|
||||||
|
_FEATURE.fields_by_name['location'].message_type = _POINT
|
||||||
|
_ROUTENOTE.fields_by_name['location'].message_type = _POINT
|
||||||
|
DESCRIPTOR.message_types_by_name['Point'] = _POINT
|
||||||
|
DESCRIPTOR.message_types_by_name['Rectangle'] = _RECTANGLE
|
||||||
|
DESCRIPTOR.message_types_by_name['Feature'] = _FEATURE
|
||||||
|
DESCRIPTOR.message_types_by_name['RouteNote'] = _ROUTENOTE
|
||||||
|
DESCRIPTOR.message_types_by_name['RouteSummary'] = _ROUTESUMMARY
|
||||||
|
|
||||||
|
Point = _reflection.GeneratedProtocolMessageType('Point', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _POINT,
|
||||||
|
__module__ = 'route_guide_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:Point)
|
||||||
|
))
|
||||||
|
_sym_db.RegisterMessage(Point)
|
||||||
|
|
||||||
|
Rectangle = _reflection.GeneratedProtocolMessageType('Rectangle', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _RECTANGLE,
|
||||||
|
__module__ = 'route_guide_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:Rectangle)
|
||||||
|
))
|
||||||
|
_sym_db.RegisterMessage(Rectangle)
|
||||||
|
|
||||||
|
Feature = _reflection.GeneratedProtocolMessageType('Feature', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _FEATURE,
|
||||||
|
__module__ = 'route_guide_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:Feature)
|
||||||
|
))
|
||||||
|
_sym_db.RegisterMessage(Feature)
|
||||||
|
|
||||||
|
RouteNote = _reflection.GeneratedProtocolMessageType('RouteNote', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _ROUTENOTE,
|
||||||
|
__module__ = 'route_guide_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:RouteNote)
|
||||||
|
))
|
||||||
|
_sym_db.RegisterMessage(RouteNote)
|
||||||
|
|
||||||
|
RouteSummary = _reflection.GeneratedProtocolMessageType('RouteSummary', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _ROUTESUMMARY,
|
||||||
|
__module__ = 'route_guide_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:RouteSummary)
|
||||||
|
))
|
||||||
|
_sym_db.RegisterMessage(RouteSummary)
|
||||||
|
|
||||||
|
|
||||||
|
import abc
|
||||||
|
from grpc._adapter import fore
|
||||||
|
from grpc._adapter import rear
|
||||||
|
from grpc.framework.assembly import implementations
|
||||||
|
from grpc.framework.assembly import utilities
|
||||||
|
class EarlyAdopterRouteGuideServicer(object):
|
||||||
|
"""<fill me in later!>"""
|
||||||
|
__metaclass__ = abc.ABCMeta
|
||||||
|
@abc.abstractmethod
|
||||||
|
def GetFeature(self, request):
|
||||||
|
raise NotImplementedError()
|
||||||
|
@abc.abstractmethod
|
||||||
|
def ListFeatures(self, request):
|
||||||
|
raise NotImplementedError()
|
||||||
|
@abc.abstractmethod
|
||||||
|
def RecordRoute(self, request_iterator):
|
||||||
|
raise NotImplementedError()
|
||||||
|
@abc.abstractmethod
|
||||||
|
def RouteChat(self, request_iterator):
|
||||||
|
raise NotImplementedError()
|
||||||
|
class EarlyAdopterRouteGuideServer(object):
|
||||||
|
"""<fill me in later!>"""
|
||||||
|
__metaclass__ = abc.ABCMeta
|
||||||
|
@abc.abstractmethod
|
||||||
|
def start(self):
|
||||||
|
raise NotImplementedError()
|
||||||
|
@abc.abstractmethod
|
||||||
|
def stop(self):
|
||||||
|
raise NotImplementedError()
|
||||||
|
class EarlyAdopterRouteGuideStub(object):
|
||||||
|
"""<fill me in later!>"""
|
||||||
|
__metaclass__ = abc.ABCMeta
|
||||||
|
@abc.abstractmethod
|
||||||
|
def GetFeature(self, request):
|
||||||
|
raise NotImplementedError()
|
||||||
|
GetFeature.async = None
|
||||||
|
@abc.abstractmethod
|
||||||
|
def ListFeatures(self, request):
|
||||||
|
raise NotImplementedError()
|
||||||
|
ListFeatures.async = None
|
||||||
|
@abc.abstractmethod
|
||||||
|
def RecordRoute(self, request_iterator):
|
||||||
|
raise NotImplementedError()
|
||||||
|
RecordRoute.async = None
|
||||||
|
@abc.abstractmethod
|
||||||
|
def RouteChat(self, request_iterator):
|
||||||
|
raise NotImplementedError()
|
||||||
|
RouteChat.async = None
|
||||||
|
def early_adopter_create_RouteGuide_server(servicer, port, root_certificates, key_chain_pairs):
|
||||||
|
method_implementations = {
|
||||||
|
"GetFeature": utilities.unary_unary_inline(servicer.GetFeature),
|
||||||
|
"ListFeatures": utilities.unary_stream_inline(servicer.ListFeatures),
|
||||||
|
"RecordRoute": utilities.stream_unary_inline(servicer.RecordRoute),
|
||||||
|
"RouteChat": utilities.stream_stream_inline(servicer.RouteChat),
|
||||||
|
}
|
||||||
|
import route_guide_pb2
|
||||||
|
import route_guide_pb2
|
||||||
|
import route_guide_pb2
|
||||||
|
import route_guide_pb2
|
||||||
|
request_deserializers = {
|
||||||
|
"GetFeature": route_guide_pb2.Point.FromString,
|
||||||
|
"ListFeatures": route_guide_pb2.Rectangle.FromString,
|
||||||
|
"RecordRoute": route_guide_pb2.Point.FromString,
|
||||||
|
"RouteChat": route_guide_pb2.RouteNote.FromString,
|
||||||
|
}
|
||||||
|
response_serializers = {
|
||||||
|
"GetFeature": lambda x: x.SerializeToString(),
|
||||||
|
"ListFeatures": lambda x: x.SerializeToString(),
|
||||||
|
"RecordRoute": lambda x: x.SerializeToString(),
|
||||||
|
"RouteChat": lambda x: x.SerializeToString(),
|
||||||
|
}
|
||||||
|
link = fore.activated_fore_link(port, request_deserializers, response_serializers, root_certificates, key_chain_pairs)
|
||||||
|
return implementations.assemble_service(method_implementations, link)
|
||||||
|
def early_adopter_create_RouteGuide_stub(host, port):
|
||||||
|
method_implementations = {
|
||||||
|
"GetFeature": utilities.unary_unary_inline(None),
|
||||||
|
"ListFeatures": utilities.unary_stream_inline(None),
|
||||||
|
"RecordRoute": utilities.stream_unary_inline(None),
|
||||||
|
"RouteChat": utilities.stream_stream_inline(None),
|
||||||
|
}
|
||||||
|
import route_guide_pb2
|
||||||
|
import route_guide_pb2
|
||||||
|
import route_guide_pb2
|
||||||
|
import route_guide_pb2
|
||||||
|
response_deserializers = {
|
||||||
|
"GetFeature": route_guide_pb2.Feature.FromString,
|
||||||
|
"ListFeatures": route_guide_pb2.Feature.FromString,
|
||||||
|
"RecordRoute": route_guide_pb2.RouteSummary.FromString,
|
||||||
|
"RouteChat": route_guide_pb2.RouteNote.FromString,
|
||||||
|
}
|
||||||
|
request_serializers = {
|
||||||
|
"GetFeature": lambda x: x.SerializeToString(),
|
||||||
|
"ListFeatures": lambda x: x.SerializeToString(),
|
||||||
|
"RecordRoute": lambda x: x.SerializeToString(),
|
||||||
|
"RouteChat": lambda x: x.SerializeToString(),
|
||||||
|
}
|
||||||
|
link = rear.activated_rear_link(host, port, request_serializers, response_deserializers)
|
||||||
|
return implementations.assemble_dynamic_inline_stub(method_implementations, link)
|
||||||
|
# @@protoc_insertion_point(module_scope)
|
||||||
|
|
@ -0,0 +1,147 @@
|
||||||
|
# Copyright 2015, Google Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are
|
||||||
|
# met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above
|
||||||
|
# copyright notice, this list of conditions and the following disclaimer
|
||||||
|
# in the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
# * Neither the name of Google Inc. nor the names of its
|
||||||
|
# contributors may be used to endorse or promote products derived from
|
||||||
|
# this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
"""The Python implementation of the gRPC route guide server."""
|
||||||
|
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
import math
|
||||||
|
|
||||||
|
import route_guide_pb2
|
||||||
|
|
||||||
|
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
|
||||||
|
|
||||||
|
|
||||||
|
def read_route_guide_db():
|
||||||
|
"""Reads the route guide"""
|
||||||
|
feature_list = []
|
||||||
|
with open("route_guide_db.json") as route_guide_db_file:
|
||||||
|
for item in json.load(route_guide_db_file):
|
||||||
|
feature = route_guide_pb2.Feature(name=item["name"])
|
||||||
|
feature.location.longitude = item["location"]["longitude"]
|
||||||
|
feature.location.latitude = item["location"]["latitude"]
|
||||||
|
feature_list.append(feature)
|
||||||
|
return feature_list
|
||||||
|
|
||||||
|
|
||||||
|
def get_feature(feature_db, point):
|
||||||
|
"""Returns feature at given location or None"""
|
||||||
|
for feature in feature_db:
|
||||||
|
if feature.location == point:
|
||||||
|
return feature
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def get_distance(start, end):
|
||||||
|
"""Distance between two points"""
|
||||||
|
coord_factor = 10000000.0
|
||||||
|
lat_1 = start.latitude / coord_factor
|
||||||
|
lat_2 = end.latitude / coord_factor
|
||||||
|
lon_1 = start.latitude / coord_factor
|
||||||
|
lon_2 = end.longitude / coord_factor
|
||||||
|
lat_rad_1 = math.radians(lat_1)
|
||||||
|
lat_rad_2 = math.radians(lat_2)
|
||||||
|
delta_lat_rad = math.radians(lat_2 - lat_1)
|
||||||
|
delta_lon_rad = math.radians(lon_2 - lon_1)
|
||||||
|
|
||||||
|
a = pow(math.sin(delta_lat_rad / 2), 2) + math.cos(lat_rad_1) * math.cos(lat_rad_2) * pow(math.sin(delta_lon_rad / 2), 2)
|
||||||
|
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
|
||||||
|
R = 6371000; # metres
|
||||||
|
return R * c;
|
||||||
|
|
||||||
|
class RouteGuideServicer(route_guide_pb2.EarlyAdopterRouteGuideServicer):
|
||||||
|
"""Provides methods that implement functionality of route guide server."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.db = read_route_guide_db()
|
||||||
|
|
||||||
|
def GetFeature(self, request, context):
|
||||||
|
feature = get_feature(self.db, request)
|
||||||
|
if not feature:
|
||||||
|
feature = route_guide_pb2.Feature(name="")
|
||||||
|
feature.location.longitude = request.longitude
|
||||||
|
feature.location.latitude = request.latitude
|
||||||
|
return feature
|
||||||
|
|
||||||
|
def ListFeatures(self, request, context):
|
||||||
|
lo = request.lo
|
||||||
|
hi = request.hi
|
||||||
|
left = min(lo.longitude, hi.longitude)
|
||||||
|
right = max(lo.longitude, hi.longitude)
|
||||||
|
top = max(lo.latitude, hi.latitude)
|
||||||
|
bottom = min(lo.latitude, hi.latitude)
|
||||||
|
for feature in self.db:
|
||||||
|
if (feature.location.longitude >= left and
|
||||||
|
feature.location.longitude <= right and
|
||||||
|
feature.location.latitude >= bottom and
|
||||||
|
feature.location.latitude <= top):
|
||||||
|
yield feature
|
||||||
|
|
||||||
|
def RecordRoute(self, request_iterator, context):
|
||||||
|
point_count = 0
|
||||||
|
feature_count = 0
|
||||||
|
distance = 0.0
|
||||||
|
prev_point = None
|
||||||
|
|
||||||
|
start_time = time.time()
|
||||||
|
for point in request_iterator:
|
||||||
|
point_count += 1
|
||||||
|
if get_feature(self.db, point):
|
||||||
|
feature_count += 1
|
||||||
|
if prev_point:
|
||||||
|
distance += get_distance(prev_point, point)
|
||||||
|
prev_point = point
|
||||||
|
|
||||||
|
elapsed_time = time.time() - start_time
|
||||||
|
return route_guide_pb2.RouteSummary(point_count=point_count,
|
||||||
|
feature_count=feature_count,
|
||||||
|
distance=int(distance),
|
||||||
|
elapsed_time=int(elapsed_time))
|
||||||
|
|
||||||
|
def RouteChat(self, request_iterator, context):
|
||||||
|
prev_notes = []
|
||||||
|
for new_note in request_iterator:
|
||||||
|
for prev_note in prev_notes:
|
||||||
|
if prev_note.location == new_note.location:
|
||||||
|
yield prev_note
|
||||||
|
prev_notes.append(new_note)
|
||||||
|
|
||||||
|
|
||||||
|
def serve():
|
||||||
|
server = route_guide_pb2.early_adopter_create_RouteGuide_server(
|
||||||
|
RouteGuideServicer(), 50051, None, None)
|
||||||
|
server.start()
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
time.sleep(_ONE_DAY_IN_SECONDS)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
server.stop()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
serve()
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# This is where you have cloned out the https://github.com/grpc/grpc repository
|
||||||
|
# And built gRPC Python.
|
||||||
|
# ADJUST THIS PATH TO WHERE YOUR ACTUAL LOCATION IS
|
||||||
|
GRPC_ROOT=~/github/grpc
|
||||||
|
|
||||||
|
$GRPC_ROOT/python2.7_virtual_environment/bin/python -B route_guide_client.py
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Runs the protoc with gRPC plugin to generate protocol messages and gRPC stubs.
|
||||||
|
protoc -I . --python_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_python_plugin` route_guide.proto
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# This is where you have cloned out the https://github.com/grpc/grpc repository
|
||||||
|
# And built gRPC Python.
|
||||||
|
# ADJUST THIS PATH TO WHERE YOUR ACTUAL LOCATION IS
|
||||||
|
GRPC_ROOT=~/github/grpc
|
||||||
|
|
||||||
|
$GRPC_ROOT/python2.7_virtual_environment/bin/python -B route_guide_server.py
|
||||||
Loading…
Reference in New Issue