Skip to content

Instantly share code, notes, and snippets.

@kielni
Last active August 29, 2015 13:57
Show Gist options
  • Save kielni/9417662 to your computer and use it in GitHub Desktop.
Save kielni/9417662 to your computer and use it in GitHub Desktop.
Map where Amazon orders go

Map where Amazon orders go

The Friends of the Alum Rock library sells books via Amazon to raise money for library programs. We thought it would be fun to see where we send the books.

fetch orders

Amazon makes it surprisingly hard to get programmatic access to order information. They do have an API (Amazon Marketplace Web Service), but it's only available to business sellers.

I wrote a Python script using mechanize that logs in to our seller account, goes to the order page, and clicks each of the orders to get to the order detail page. From there, I used regular expressions to extract the relevant order info (shipping address, date, price, and title). The HTML is not very well marked up, so this is likely to break. I use the MapQuest geocoding API to convert the mailing address to latitude/longitude so it can be mapped easily. I save this data in GeoJSON format, and update it whenever an order comes in. The orders.json file contains some sample data but is not updated automatically.

display orders

I used MapBox and Leaflet to display the GeoJSON orders data on a map, with a jQuery UI slider to filter orders by price.

I wanted custom markers created from GeoJSON data that can be filtered by the user. This was harder than I expected:

  • adding markers with L.geoJson doesn't add them to a L.mapbox.featureLayer that can respond to events
  • creating markers using L.mapbox.featureLayer doesn't allow customizing the markers
  • L.mapbox.featureLayer.setFilter doesn't run for markers added manually to the feature layer

Here's how I got it working:

  • create a feature layer with no data: var featureLayer = L.mapbox.featureLayer(null);
  • load the geoJSON data with jQuery $.getJSON
  • iterate through the data and create a CircleMarker for each feature, with color and size a function of age and sale price
  • add the marker to the feature layer
  • save the CircleMarker objects in an array keyed by orderID
  • in the price filter slider's change function, clear all the markers from the feature layer
  • for each feature that matches the selected price criteria, lookup the saved layer and add it to the feature layer
import mechanize
import json
import re
import requests
import datetime
from datetime import timedelta
from datetime import date
# scrape recent order data from Amazon Seller Central site
# load config
# { "geojson_fn" : "orders.json", "username" : "amazon_login",
# "password" : "amazon_password", "mapquest_key" : "mapquest API key" }
with open("config.json") as cf:
config = json.load(cf)
MQ_URL = "http://www.mapquestapi.com/geocoding/v1/address?key="+config["mapquest_key"]
# load orders.json data
with open(config["geojson_fn"]) as jf:
orders = json.load(jf)
br = mechanize.Browser()
br.set_handle_robots(False)
br.addheaders = [("User-agent", "Mozilla/5.0")]
# log in
sign_in = br.open("https://sellercentral.amazon.com/gp/homepage.html")
br.select_form(name="signinWidget")
br["username"] = config["username"]
br["password"] = config["password"]
logged_in = br.submit()
# get orders for last 7 days
days = 7
week = timedelta(days=days)
today = date.today()
beginDate = (today-week).strftime("%m%%2F%d%%2F%y")
endDate = today.strftime("%m%%2F%d%%2F%y")
dayRange = str(days)
url = "https://sellercentral.amazon.com/gp/orders-v2/list?ie=UTF8&ajaxBelowTheFoldRows=0&byDate=orderDate&currentPage=1&exactDateBegin="+beginDate+"&exactDateEnd="+endDate+"&highlightOrderID=&isBelowTheFold=1&isDebug=0&isSearch=0&itemsPerPage=100&paymentFilter=Default&preSelectedRange="+dayRange+"&searchDateOption=preSelected&searchFulfillers=all&searchKeyword=&searchLanguage=en_US&searchType=0&shipExactDateBegin="+beginDate+"&shipExactDateEnd="+endDate+"&shipSearchDateOption=shipPreSelected&shipSelectedRange=7&shipmentFilter=Default&showCancelled=0&showPending=0&sortBy=OrderStatusDescending&statusFilter=Default"
orders_html = br.open(url)
# click order links to get to detail page
for l in br.links(url_regex='orders-v2/detail'):
# get orderID from the URL
m = re.search(".*?orderID=(\d+-\d+-\d+)", l.url)
order_id = m.group(1)
print order_id
# continue if order is already in file
if any(x for x in orders["features"] if x["properties"]["orderID"] == order_id):
print "\talready have order_id %s" % order_id
continue
# go to order detail
br.follow_link(l)
data = br.response().get_data()
# get address
m = re.search('<td.*?>.*?Shipping Address:.*?<br>(.*)</td>', data, re.M)
addr = m.group(1).replace('&nbsp;', ' ')
lines = addr.split('<br>')
address = ",".join(lines[1:])
params = { "location" : address }
# geocode
r = requests.get(MQ_URL, params=params)
geocode = json.loads(r.text)
coord = geocode["results"][0]["locations"][0]["displayLatLng"]
lng_lat = [coord["lng"], coord["lat"]]
# get order date
m = re.search('<td.*?>.*?Purchase Date:</td>.*?<td.*?>(.*?)</td>', data, re.M|re.S)
dt = m.group(1)
dtstr = datetime.datetime.strptime(dt, "%B %d, %Y %H:%M:%S %p %Z").strftime("%Y-%m-%d")
# get price
m = re.search('<td.*?>.*?Items total:</td>.*?<td.*?>\$(.*?)</td>', data, re.M|re.S)
price = float(m.group(1))
# get title
for l in br.links(url_regex='/gp/product/'):
title = l.text
order = {
"type" : "Feature",
"geometry" : {
"type" : "Point",
"coordinates" : lng_lat
},
"properties" : {
"orderID" : order_id,
"orderDate" : dtstr,
"price" : price,
"title" : title
}
}
# write to file
orders["features"].append(order)
with open(config["geojson_fn"], "w") as jf:
json.dump(orders, jf, indent=2)
print "wrote %i orders to %s" % (len(orders), config["geojson_fn"])
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore-min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/d3/3.4.2/d3.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css" />
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<script src="https://api.tiles.mapbox.com/mapbox.js/v1.6.1/mapbox.js"></script>
<link href="https://api.tiles.mapbox.com/mapbox.js/v1.6.1/mapbox.css" rel="stylesheet" />
<script src="http://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>
<style>
#map {
width: 600px;
height: 400px;
}
.popupText {
font-size: 11px;
}
.legend {
font-size: 8px;
}
.legend i {
float: left;
height: 16px;
margin-right: 5px;
margin-top: 4px;
opacity: 0.7;
width: 16px;
}
.legend i.circle-4 {
border-radius: 50%;
width: 4px;
height: 4px;
margin-top: 8px;
}
.legend i.circle-6 {
border-radius: 50%;
width: 6px;
height: 6px;
margin-top: 8px;
}
.legend i.circle-8 {
border-radius: 50%;
width: 8px;
height: 8px;
margin-top: 8px;
}
.legend i.circle-10 {
border-radius: 50%;
width: 10px;
height: 10px;
margin-top: 8px;
}
.legend-block {
float: left;
padding-right: 5px;
}
.legend-header {
font-weight: bold;
height: 14px;
}
.legend-row {
height: 20px;
}
#price-slider {
width: 300px;
margin-bottom: 0.5em;
margin-left: 0.5em;
}
#price {
border: 0;
font-weight: bold;
}
</style>
<script type="text/javascript">
jQuery(function($) {
// want: custom markers from geoJSON data that can be filtered
//
// adding markers with L.geoJson doesn't add them to a featureLayer that
// can respond to events
// creating them via featureLayer doesn't have a way to customize the markers
// setFilter doesn't run for markers added manually to the feature layer
// solution: keep a reference to the marker layers; clear layers on filter
// and re-populate using saved layers
var map = L.mapbox.map('map')
.setView([37.8, -96], 4)
.addLayer(L.mapbox.tileLayer("kielni.heic2ki4"));
// add markers manually so they can be customized
var featureLayer = L.mapbox.featureLayer(null);
// hold references to layers since there's no way to hide/show them
// other than add/remove
var markers = {};
var colors = ["#238b45", "#66c2a4", "#b2e2e2", "#edf8fb" ];
var ageThresholds = [ 0, 7, 30, 90, 9999 ];
var sizeReduce = [ 6, 4, 2, 0 ];
var pricePoints = [ 0, 10, 30, 50, 9999 ];
var today = moment();
// load JSON data
$.getJSON("orders.json", function(data) {
// create a CircleMarker for each feature
// color depends on age in days
// size depends on sale price
for (i = data.features.length - 1; i >= 0; i--) {
var feature = data.features[i];
var days = today.diff(moment(feature.properties.orderDate), 'days');
var idx = 0;
_.find(ageThresholds, function(age) {
idx++;
return days < age;
});
idx = -1;
_.find(pricePoints, function(pp) {
idx++;
return feature.properties.price < pp;
});
var size = 10 - sizeReduce[idx-1];
console.log("price="+feature.properties.price+" idx="+(idx-1)+" size="+size);
var coords = feature.geometry.coordinates;
var latlng = [coords[1], coords[0]];
var marker = L.circleMarker(latlng, {
radius: size,
fillColor: colors[idx-1],
color: colors[idx-1],
weight: 1,
color: "#000",
fillOpacity: 0.8
});
// popup with title, price, and date
var popup = '<div class="popupText">'+feature.properties.title+"<br>"+
moment(feature.properties.orderDate).format("MM/DD/YY")+
" $"+feature.properties.price.toFixed(2)+"</div>";
feature.properties.popupText = popup;
marker.bindPopup(popup);
// save the marker
markers[feature.properties.orderID] = marker;
featureLayer.addLayer(marker);
}
featureLayer.addTo(map);
// legend
var legendControl = L.control({position: "bottomleft"});
legendControl.onAdd = function(map) {
var div = L.DomUtil.create("div", "info legend");
var text = '<div class="legend-header">Days ago</div>';
for (var i = 0; i < colors.length; i++) {
text += '<div class="legend-row">';
text += '<i style="background:' + colors[i] + '"></i> '+ageThresholds[i];
if (i == ageThresholds.length-2) {
text += "+";
} else {
text += " - "+ageThresholds[i+1];
}
text += " days</div>";
}
div.innerHTML = '<div class="legend-block">'+text+'</div>';
text = '<div class="legend-header">Sale price</div>';
var numLegendPrices = pricePoints.length-1;
for (var i = 0; i < numLegendPrices; i++) {
var size = 10-sizeReduce[i];
text += '<div class="legend-row">';
text += '<i class="legend-row circle-'+size+'" style="background:' + colors[0] + '"></i> $'+pricePoints[i].toFixed(2);
if (i == numLegendPrices-1) {
text += "+";
} else {
text += " - $"+pricePoints[i+1].toFixed(2);
}
text += "</div>";
}
div.innerHTML += '<div class="legend-block">'+text+'</div>';
return div;
};
legendControl.addTo(map);
// price range slider
var minPrice = d3.min(data.features, function(d) {
return d.properties.price });
var maxPrice = d3.max(data.features, function(d) {
return d.properties.price });
$("#price-range").slider({
range: true,
min: Math.round(minPrice),
max: Math.round(maxPrice),
values: [ minPrice, maxPrice ],
change: function(e, ui) {
var minPrice = ui.values[0];
var maxPrice = ui.values[1];
$("#price").val("$"+minPrice+" - $"+maxPrice);
// clear all
featureLayer.clearLayers();
_.each(data.features, function(feature) {
var price = feature.properties.price;
// add back from saved markers if price meets criteria
if (price >= minPrice && price <= maxPrice) {
featureLayer.addLayer(markers[feature.properties.orderID] );
}
});
}
});
var minPriceStr = "$"+$("#price-range").slider("values", 0);
var maxPriceStr = "$"+$("#price-range").slider("values", 1);
$("#price").val(minPriceStr+" - "+maxPriceStr);
});
});
</script>
</head>
<body>
<h2>Where do our Amazon orders go?</h2>
<div id="price-slider">
<label for="price-range">Show sale prices:</label>
<input type="text" id="price">
<div id="price-range"></div>
</div>
<div id="map"></div>
</body>
</html>
Display the source blob
Display the rendered blob
Raw
{
"type": "FeatureCollection",
"features": [
{
"geometry": {
"type": "Point",
"coordinates": [
-119.20248,
34.46152
]
},
"type": "Feature",
"properties": {
"orderID": "103-0941360-6058658",
"price": 32.0,
"orderDate": "2014-02-28",
"title": "Painting Wildlife with John Seerey-Lester [Hardcover] [2003] Seerey-Lester, John"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-80.330116,
25.836754
]
},
"type": "Feature",
"properties": {
"orderID": "115-8977196-7405034",
"price": 35.0,
"orderDate": "2014-02-25",
"title": "Tu Vida En Tus Manos (Integral (Barcelona, Spain).) (Spanish Edition) [Hardcover..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-82.131447,
33.513798
]
},
"type": "Feature",
"properties": {
"orderID": "105-3129965-3332222",
"price": 6.0,
"orderDate": "2014-02-24",
"title": "I Don't Care! Said the Bear [Hardcover] [1996] West, Colin"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-83.00167,
39.95059
]
},
"type": "Feature",
"properties": {
"orderID": "110-1183643-5633043",
"price": 5.0,
"orderDate": "2014-02-24",
"title": "Fabric Dyeing For Beginners [Paperback] [2003] Vimala McClure"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-111.062836,
32.306551
]
},
"type": "Feature",
"properties": {
"orderID": "115-0894091-3496221",
"price": 17.0,
"orderDate": "2014-02-20",
"title": "Electric Traction on the Pennsylvania Railroad, 1895-1968 [Hardcover] [1980] Bez..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-80.1833,
27.15119
]
},
"type": "Feature",
"properties": {
"orderID": "102-2172324-1597807",
"price": 5.0,
"orderDate": "2014-02-11",
"title": "When the Spirits Dance Mambo: Growing Up Nuyorican in El Barrio [Paperback] [200..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-121.85953,
37.3752
]
},
"type": "Feature",
"properties": {
"orderID": "106-9300580-7751463",
"price": 8.0,
"orderDate": "2014-02-08",
"title": "Basic Math Skills Student Text [Hardcover] [2006] AGS Secondary"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-122.2646,
37.8423
]
},
"type": "Feature",
"properties": {
"orderID": "105-9705267-7821025",
"price": 20.0,
"orderDate": "2014-02-08",
"title": "The Developing Person Through Childhood and Adolescence [Hardcover] [2008] Berge..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-117.16521,
32.753239
]
},
"type": "Feature",
"properties": {
"orderID": "110-8097690-4977851",
"price": 25.0,
"orderDate": "2014-02-06",
"title": "Elfquest Reader's Collection #16: WaveDancers [Paperback] [2000] Richard Pini; V..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-117.77,
40.9852
]
},
"type": "Feature",
"properties": {
"orderID": "106-5863737-7958627",
"price": 18.0,
"orderDate": "2014-02-06",
"title": "Side by Side 3 Student Book with Audio CD Highlights (Bk. 3) [Paperback] [2003] ..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-91.520493,
41.639568
]
},
"type": "Feature",
"properties": {
"orderID": "102-4629553-1910644",
"price": 20.0,
"orderDate": "2014-02-03",
"title": "Focus on Pronunciation: High-Intermediate Advanced Answer Key [Paperback] [2004]..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-111.985644,
33.512681
]
},
"type": "Feature",
"properties": {
"orderID": "102-0553474-2129847",
"price": 5.0,
"orderDate": "2014-02-02",
"title": "Elixir: A History of Water and Humankind [Hardcover] [2011] Fagan, Brian"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-117.966698,
33.839745
]
},
"type": "Feature",
"properties": {
"orderID": "110-3802988-7477808",
"price": 18.0,
"orderDate": "2014-01-30",
"title": "Beyond True Stories with Audio CD [Paperback] [2003] Heyer, Sandra"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-76.36866,
39.422958
]
},
"type": "Feature",
"properties": {
"orderID": "111-2475903-4131466",
"price": 28.0,
"orderDate": "2014-01-29",
"title": "Dawn of the Diesel Age: The History of the Diesel Locomotive in America (Interur..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-117.7877,
33.74592
]
},
"type": "Feature",
"properties": {
"orderID": "116-6490027-2124208",
"price": 18.0,
"orderDate": "2014-01-26",
"title": "Beyond True Stories with Audio CD [Paperback] [2003] Heyer, Sandra"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-85.507632,
32.572826
]
},
"type": "Feature",
"properties": {
"orderID": "002-9142983-2473060",
"price": 18.0,
"orderDate": "2014-01-25",
"title": "Side by Side 3 Student Book with Audio CD Highlights (Bk. 3) [Paperback] [2003] ..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-117.96772,
33.838619
]
},
"type": "Feature",
"properties": {
"orderID": "107-7260511-6287468",
"price": 20.0,
"orderDate": "2014-01-23",
"title": "Library Assistant(Passbooks) (Passbooks for Career Opportunities) [Plastic Comb]..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-74.08739,
40.91234
]
},
"type": "Feature",
"properties": {
"orderID": "102-5545288-0173814",
"price": 25.0,
"orderDate": "2014-01-23",
"title": "The Nag Hammadi Library in English [Hardcover] [1997] Robinson, James McConkey"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-88.276367,
43.599102
]
},
"type": "Feature",
"properties": {
"orderID": "107-8133511-0553055",
"price": 12.0,
"orderDate": "2014-01-22",
"title": "American Manners and Customs: A Guide for Newcomers (The best of Easy English Ne..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-80.373894,
25.80422
]
},
"type": "Feature",
"properties": {
"orderID": "113-1511490-6521035",
"price": 17.0,
"orderDate": "2014-01-22",
"title": "Los Diez Mandamientos: Manual Para la Vida Cristiana [Unknown Binding] [2000] Do..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-85.43261,
31.24535
]
},
"type": "Feature",
"properties": {
"orderID": "113-6074796-1606622",
"price": 13.0,
"orderDate": "2014-03-06",
"title": "Mary in Western Art [Hardcover] [2005] Verdon, Timothy"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-73.792107,
40.693867
]
},
"type": "Feature",
"properties": {
"orderID": "106-1083183-5301830",
"price": 12.0,
"orderDate": "2014-03-06",
"title": "Stress Management for Life: A Research-Based Experiential Approach (with Stress ..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-71.4952,
41.44225
]
},
"type": "Feature",
"properties": {
"orderID": "109-1442209-3705030",
"price": 36.0,
"orderDate": "2014-01-21",
"title": "Theory & Design of Loudspeaker Enclosures [Paperback] [1996] Benson, J. E."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-118.533745,
34.225559
]
},
"type": "Feature",
"properties": {
"orderID": "102-8681200-4101866",
"price": 45.0,
"orderDate": "2014-01-17",
"title": "Damn Everything But The Circus [Hardcover] [1970] Corita Kent"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-84.331917,
30.450182
]
},
"type": "Feature",
"properties": {
"orderID": "002-5836182-1197815",
"price": 99.0,
"orderDate": "2014-01-15",
"title": "The Sandler Rules: 49 Timeless Selling Principles and How to Apply Them [Hardcov..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-122.121933,
47.555485
]
},
"type": "Feature",
"properties": {
"orderID": "116-7629443-2813046",
"price": 18.0,
"orderDate": "2014-01-13",
"title": "Beyond True Stories with Audio CD [Paperback] [2003] Heyer, Sandra"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-101.90024,
35.16239
]
},
"type": "Feature",
"properties": {
"orderID": "107-1609776-1935423",
"price": 9.0,
"orderDate": "2014-01-10",
"title": "Digital Video Compression (with CD-ROM) [Paperback] [2003] Peter Symes"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-92.001862,
34.221649
]
},
"type": "Feature",
"properties": {
"orderID": "112-0261234-4877044",
"price": 14.0,
"orderDate": "2014-01-09",
"title": "Nina Bonita (Children's Books from Around the World) [Hardcover] [1996] Machado,..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-74.497112,
40.435194
]
},
"type": "Feature",
"properties": {
"orderID": "113-6721875-1687426",
"price": 8.0,
"orderDate": "2014-01-08",
"title": "Hunger: A Modern History [Hardcover] [2007] Vernon, James"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-96.73137,
33.04655
]
},
"type": "Feature",
"properties": {
"orderID": "108-8570856-3749821",
"price": 8.0,
"orderDate": "2014-01-08",
"title": "Teatro Chicana: A Collective Memoir and Selected Plays (Chicana Matters) [Paperb..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-77.40699,
38.91743
]
},
"type": "Feature",
"properties": {
"orderID": "116-9585249-1658633",
"price": 15.0,
"orderDate": "2014-01-07",
"title": "Basic English Grammar, Third Edition (Full Student Book with Audio CD and Answe..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-85.242241,
40.875862
]
},
"type": "Feature",
"properties": {
"orderID": "105-9888665-1598659",
"price": 45.0,
"orderDate": "2014-01-07",
"title": "Norman Rockwell: Artist and Illustrator [Hardcover] [1996] Buechner, Thomas S."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-111.964684,
33.445869
]
},
"type": "Feature",
"properties": {
"orderID": "110-6460795-8661814",
"price": 16.0,
"orderDate": "2014-01-07",
"title": "International Medical Communication in English (Michigan Series in English for A..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-83.451515,
41.935818
]
},
"type": "Feature",
"properties": {
"orderID": "002-0873821-1511428",
"price": 8.0,
"orderDate": "2014-01-06",
"title": "Transitioning From LPN/VN to RN: Moving Ahead in Your Career [Paperback] [2010] ..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-89.883942,
37.80476
]
},
"type": "Feature",
"properties": {
"orderID": "106-5387551-2005817",
"price": 6.0,
"orderDate": "2014-01-06",
"title": "4x4 Suspension Handbook (S-A Design) [Paperback] [2008] Trent Mcgee"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-71.414299,
41.873432
]
},
"type": "Feature",
"properties": {
"orderID": "107-5317440-9500262",
"price": 15.0,
"orderDate": "2014-01-06",
"title": "Basic English Grammar, Third Edition (Full Student Book with Audio CD and Answe..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-73.9546,
40.78886
]
},
"type": "Feature",
"properties": {
"orderID": "109-8110161-6244207",
"price": 35.0,
"orderDate": "2014-01-06",
"title": "Michelin Green Guide Netherlands, 5e (Green Guide/Michelin) [Paperback] [2009] M..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-96.394646,
30.67444
]
},
"type": "Feature",
"properties": {
"orderID": "104-9511813-1168265",
"price": 12.0,
"orderDate": "2014-01-06",
"title": "Side by Side Plus 4 - Life Skills, Standards, & Test Prep (3rd Edition) [Paperba..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-85.885925,
42.960407
]
},
"type": "Feature",
"properties": {
"orderID": "115-5818456-6729808",
"price": 6.0,
"orderDate": "2014-01-06",
"title": "Discrete Mathematics and Its Applications (McGraw-Hill International Editions: M..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-74.024239,
40.778339
]
},
"type": "Feature",
"properties": {
"orderID": "103-1389397-2709021",
"price": 15.0,
"orderDate": "2014-01-06",
"title": "Basic English Grammar, Third Edition (Full Student Book with Audio CD and Answe..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-105.083557,
39.791164
]
},
"type": "Feature",
"properties": {
"orderID": "109-5331315-6338628",
"price": 6.0,
"orderDate": "2014-01-05",
"title": "The Lakota Way: Stories and Lessons for Living (Compass) [Paperback] [2002] Mars..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-73.952538,
40.719372
]
},
"type": "Feature",
"properties": {
"orderID": "102-6525194-5497830",
"price": 4.5,
"orderDate": "2014-01-05",
"title": "1Q84 [Hardcover] [2011] Murakami, Haruki; Rubin, Jay; Gabriel, Philip"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-78.53529,
35.64621
]
},
"type": "Feature",
"properties": {
"orderID": "107-9241947-5110601",
"price": 9.0,
"orderDate": "2014-01-05",
"title": "Tagalog-English/English-Tagalog Standard Dictionary: Pilipino-Inggles, Inggles-P..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-99.540833,
40.74028
]
},
"type": "Feature",
"properties": {
"orderID": "109-2173411-9477854",
"price": 28.0,
"orderDate": "2014-01-05",
"title": "Going Gray, Looking Great!: The Modern Woman's Guide to Unfading Glory [Paperbac..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-97.135101,
33.197955
]
},
"type": "Feature",
"properties": {
"orderID": "106-3074974-1157061",
"price": 8.0,
"orderDate": "2014-01-05",
"title": "No Angel in the Classroom [Paperback] [2001] Fisher, Berenice Malka"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-88.951622,
42.77322
]
},
"type": "Feature",
"properties": {
"orderID": "002-3891999-4810647",
"price": 14.0,
"orderDate": "2014-01-05",
"title": "Jazz (College Edition) [Paperback] [2009] DeVeaux, Scott; Giddins, Gary"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-87.363266,
38.330948
]
},
"type": "Feature",
"properties": {
"orderID": "107-0794753-7541869",
"price": 6.0,
"orderDate": "2014-01-05",
"title": "Just for Today: Daily Meditations for Recovering Addicts [Paperback] [1992] Narc..."
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-122.366486,
47.625893
]
},
"type": "Feature",
"properties": {
"orderID": "102-7356049-8041860",
"price": 13.0,
"orderDate": "2014-01-04",
"title": "Psychoanalytic Object Relations Therapy [Paperback] [1999] Horner, Althea"
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-96.745308,
32.85519
]
},
"type": "Feature",
"properties": {
"orderID": "113-4810116-3232243",
"price": 34.0,
"orderDate": "2014-01-04",
"title": "Analog Electronics, Second Edition [Paperback] [1999] Hickman EUR.ING BSc Hons ..."
}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment