├── .gitignore ├── .openshift ├── action_hooks │ ├── README.md │ ├── build │ ├── deploy │ ├── deploy~ │ ├── post_deploy │ └── pre_build ├── cron │ ├── README.cron │ ├── daily │ │ └── .gitignore │ ├── hourly │ │ └── .gitignore │ ├── minutely │ │ └── .gitignore │ ├── monthly │ │ └── .gitignore │ └── weekly │ │ ├── README │ │ ├── chrono.dat │ │ ├── chronograph │ │ ├── jobs.allow │ │ └── jobs.deny └── markers │ ├── .gitkeep │ └── README ├── README.md ├── deplist.txt ├── node_modules └── .gitkeep ├── npm_global_module_list ├── package.json ├── parkcoord.json ├── public └── index.html └── server.js /.gitignore: -------------------------------------------------------------------------------- 1 | lib-cov 2 | *.seed 3 | *.log 4 | *.csv 5 | *.dat 6 | *.out 7 | *.pid 8 | *.gz 9 | 10 | *.*~ 11 | 12 | pids 13 | logs 14 | results 15 | 16 | node_modules 17 | npm-debug.log 18 | -------------------------------------------------------------------------------- /.openshift/action_hooks/README.md: -------------------------------------------------------------------------------- 1 | For information about action hooks supported by OpenShift, consult the documentation: 2 | 3 | http://openshift.github.io/documentation/oo_user_guide.html#the-openshift-directory 4 | -------------------------------------------------------------------------------- /.openshift/action_hooks/build: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # This is a simple build script and will be executed on your CI system if 3 | # available. Otherwise it will execute while your application is stopped 4 | # before the deploy step. This script gets executed directly, so it 5 | # could be python, php, ruby, etc. 6 | -------------------------------------------------------------------------------- /.openshift/action_hooks/deploy: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | dbsize=$(mongo -quiet $OPENSHIFT_MONGODB_DB_HOST:$OPENSHIFT_MONGODB_DB_PORT/$OPENSHIFT_APP_NAME -u $OPENSHIFT_MONGODB_DB_USERNAME -p $OPENSHIFT_MONGODB_DB_PASSWORD --eval "db.parkpoints.count()") 4 | 5 | #If the query says that parkpoints has 0 documents then we import the data 6 | if [[ $dbsize =~ "0" ]] 7 | then 8 | #import the data 9 | mongoimport -d $OPENSHIFT_APP_NAME -c parkpoints --type json --file $OPENSHIFT_REPO_DIR/parkcoord.json -h $OPENSHIFT_MONGODB_DB_HOST --port $OPENSHIFT_MONGODB_DB_PORT -u admin -p $OPENSHIFT_MONGODB_DB_PASSWORD 10 | 11 | #make the 2D index 12 | mongo $OPENSHIFT_MONGODB_DB_HOST:$OPENSHIFT_MONGODB_DB_PORT/$OPENSHIFT_APP_NAME --eval 'db.parkpoints.ensureIndex( { pos : "2d" } );' 13 | echo "imported the data" 14 | else 15 | echo "There was already data in the database. Not importing" 16 | 17 | fi 18 | 19 | -------------------------------------------------------------------------------- /.openshift/action_hooks/deploy~: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | dbsize=$(mongo -quiet $OPENSHIFT_MONGODB_DB_HOST:$OPENSHIFT_MONGODB_DB_PORT/$OPENSHIFT_APP_NAME -u $OPENSHIFT_MONGODB_DB_USERNAME -p $OPENSHIFT_MONGODB_DB_PASSWORD --eval "db.parkpoints.count()") 4 | 5 | #If the query says that parkpoints has 0 documents then we import the data 6 | if [[ $dbsize =~ "0" ]] 7 | then 8 | #import the data 9 | mongoimport -d $OPENSHIFT_APP_NAME -c parkpoints --type json --file $OPENSHIFT_REPO_DIR/parkcoord.json -h $OPENSHIFT_MONGODB_DB_HOST --port $OPENSHIFT_MONGODB_DB_PORT -u admin -p $OPENSHIFT_MONGODB_DB_$ 10 | 11 | #make the 2D index 12 | mongo $OPENSHIFT_MONGODB_DB_HOST:$OPENSHIFT_MONGODB_DB_PORT/$OPENSHIFT_APP_NAME --eval 'db.parkpoints.ensureIndex( { pos : "2d" } );' 13 | echo "imported the data" 14 | else 15 | echo "There was already data in the database. Not importing" 16 | 17 | fi 18 | 19 | -------------------------------------------------------------------------------- /.openshift/action_hooks/post_deploy: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # This is a simple post deploy hook executed after your application 3 | # is deployed and started. This script gets executed directly, so 4 | # it could be python, php, ruby, etc. 5 | -------------------------------------------------------------------------------- /.openshift/action_hooks/pre_build: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # This is a simple script and will be executed on your CI system if 3 | # available. Otherwise it will execute while your application is stopped 4 | # before the build step. This script gets executed directly, so it 5 | # could be python, php, ruby, etc. 6 | -------------------------------------------------------------------------------- /.openshift/cron/README.cron: -------------------------------------------------------------------------------- 1 | Run scripts or jobs on a periodic basis 2 | ======================================= 3 | Any scripts or jobs added to the minutely, hourly, daily, weekly or monthly 4 | directories will be run on a scheduled basis (frequency is as indicated by the 5 | name of the directory) using run-parts. 6 | 7 | run-parts ignores any files that are hidden or dotfiles (.*) or backup 8 | files (*~ or *,) or named *.{rpmsave,rpmorig,rpmnew,swp,cfsaved} 9 | 10 | The presence of two specially named files jobs.deny and jobs.allow controls 11 | how run-parts executes your scripts/jobs. 12 | jobs.deny ===> Prevents specific scripts or jobs from being executed. 13 | jobs.allow ===> Only execute the named scripts or jobs (all other/non-named 14 | scripts that exist in this directory are ignored). 15 | 16 | The principles of jobs.deny and jobs.allow are the same as those of cron.deny 17 | and cron.allow and are described in detail at: 18 | http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/ch-Automating_System_Tasks.html#s2-autotasks-cron-access 19 | 20 | See: man crontab or above link for more details and see the the weekly/ 21 | directory for an example. 22 | 23 | -------------------------------------------------------------------------------- /.openshift/cron/daily/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thesteve0/fluentwebmap/c254511fa695032851a2121695de21e9cfd30387/.openshift/cron/daily/.gitignore -------------------------------------------------------------------------------- /.openshift/cron/hourly/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thesteve0/fluentwebmap/c254511fa695032851a2121695de21e9cfd30387/.openshift/cron/hourly/.gitignore -------------------------------------------------------------------------------- /.openshift/cron/minutely/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thesteve0/fluentwebmap/c254511fa695032851a2121695de21e9cfd30387/.openshift/cron/minutely/.gitignore -------------------------------------------------------------------------------- /.openshift/cron/monthly/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thesteve0/fluentwebmap/c254511fa695032851a2121695de21e9cfd30387/.openshift/cron/monthly/.gitignore -------------------------------------------------------------------------------- /.openshift/cron/weekly/README: -------------------------------------------------------------------------------- 1 | Run scripts or jobs on a weekly basis 2 | ===================================== 3 | Any scripts or jobs added to this directory will be run on a scheduled basis 4 | (weekly) using run-parts. 5 | 6 | run-parts ignores any files that are hidden or dotfiles (.*) or backup 7 | files (*~ or *,) or named *.{rpmsave,rpmorig,rpmnew,swp,cfsaved} and handles 8 | the files named jobs.deny and jobs.allow specially. 9 | 10 | In this specific example, the chronograph script is the only script or job file 11 | executed on a weekly basis (due to white-listing it in jobs.allow). And the 12 | README and chrono.dat file are ignored either as a result of being black-listed 13 | in jobs.deny or because they are NOT white-listed in the jobs.allow file. 14 | 15 | For more details, please see ../README.cron file. 16 | 17 | -------------------------------------------------------------------------------- /.openshift/cron/weekly/chrono.dat: -------------------------------------------------------------------------------- 1 | Time And Relative D...n In Execution (Open)Shift! 2 | -------------------------------------------------------------------------------- /.openshift/cron/weekly/chronograph: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "`date`: `cat $(dirname \"$0\")/chrono.dat`" 4 | -------------------------------------------------------------------------------- /.openshift/cron/weekly/jobs.allow: -------------------------------------------------------------------------------- 1 | # 2 | # Script or job files listed in here (one entry per line) will be 3 | # executed on a weekly-basis. 4 | # 5 | # Example: The chronograph script will be executed weekly but the README 6 | # and chrono.dat files in this directory will be ignored. 7 | # 8 | # The README file is actually ignored due to the entry in the 9 | # jobs.deny which is checked before jobs.allow (this file). 10 | # 11 | chronograph 12 | 13 | -------------------------------------------------------------------------------- /.openshift/cron/weekly/jobs.deny: -------------------------------------------------------------------------------- 1 | # 2 | # Any script or job files listed in here (one entry per line) will NOT be 3 | # executed (read as ignored by run-parts). 4 | # 5 | 6 | README 7 | 8 | -------------------------------------------------------------------------------- /.openshift/markers/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thesteve0/fluentwebmap/c254511fa695032851a2121695de21e9cfd30387/.openshift/markers/.gitkeep -------------------------------------------------------------------------------- /.openshift/markers/README: -------------------------------------------------------------------------------- 1 | Markers 2 | =========== 3 | 4 | Adding marker files to this directory will have the following effects: 5 | 6 | force_clean_build - Will remove any previously installed npm modules and 7 | re-install all the required modules from scratch 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #The code to accompany [Fluent Webcast](http://www.oreillynet.com/pub/e/3017) 2014 2 | 3 | This code actually belongs to a [blog piece](https://openshift.redhat.com/community/blogs/using-nodejs-mongodb-express-for-your-spatial-web-service-and-its-free) written on OpenShift.com 4 | 5 | 6 | It is a very simple application that let's serve up points on an OpenStreetMap base layer. If you want to use your own data you can replace the contents of parks.json with your own data and import that instead. 7 | 8 | 9 | Running on OpenShift 10 | ---------------------------- 11 | 12 | Create an account at http://openshift.redhat.com/ 13 | 14 | Create a Node.js application and add a MongoDB cartridge to the app 15 | 16 | rhc app create fluentwebmap nodejs-0.1 mongodb-2.2 -s -g medium 17 | 18 | You can name your application anything you want - it does not have to be fluentwebmap. 19 | 20 | The command line above also uses -s to make it a scalable application, where MongoDB and Node.JS are on different gears and therefore do not have to share resources. It also allows them to scale independently 21 | 22 | Since I am a paid user, I am also choosing to use medium gears (1 gig of memory) by using the -g flag for my applications. 23 | 24 | 25 | now add this upstream node repo 26 | 27 | 28 | cd fluentwebmap 29 | git remote add upstream -m master https://github.com/thesteve0/fluentwebmap.git 30 | git pull -s recursive -X theirs upstream master 31 | 32 | Then push the repo upstream 33 | 34 | git push 35 | 36 | 37 | You can now checkout your application at: 38 | 39 | http://fluentwebmap-$yournamespace.rhcloud.com/ 40 | 41 | 42 | License 43 | ------- 44 | 45 | This code is dedicated to the public domain to the maximum extent 46 | permitted by applicable law, pursuant to CC0 47 | http://creativecommons.org/publicdomain/zero/1.0/ 48 | -------------------------------------------------------------------------------- /deplist.txt: -------------------------------------------------------------------------------- 1 | # 2 | # *************************************************************************** 3 | # 4 | # Note: This file has been deprecated and exists for backward compatibility. 5 | # Please use package.json to add dependencies to the Node modules 6 | # your application requires. 7 | # 8 | # *************************************************************************** 9 | # 10 | 11 | # 12 | # For a list of globally installed modules - see file: npm_global_module_list. 13 | # 14 | -------------------------------------------------------------------------------- /node_modules/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thesteve0/fluentwebmap/c254511fa695032851a2121695de21e9cfd30387/node_modules/.gitkeep -------------------------------------------------------------------------------- /npm_global_module_list: -------------------------------------------------------------------------------- 1 | # 2 | # This file contains a list of globally installed and available npm modules. 3 | # 4 | 5 | # DB drivers. 6 | mongodb 7 | mysql 8 | pg 9 | 10 | # Other modules (including frameworks, middleware etc). 11 | async 12 | connect 13 | express 14 | formidable 15 | generic-pool 16 | hashish 17 | mime 18 | mkdirp 19 | node-static 20 | qs 21 | traverse 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "parkmapsnode", 3 | "version": "1.0.0", 4 | "description": "Mapping application built for the OReilly Webinar", 5 | "keywords": [ 6 | "OpenShift", 7 | "Node.js", 8 | "application", 9 | "openshift", 10 | "Leaflet", 11 | "Express", 12 | "MongoDB" 13 | ], 14 | "author": { 15 | "name": "Steven Pousty", 16 | "email": "spousty@redhat.com", 17 | "url": "http://openshift.redhat.com/" 18 | }, 19 | "homepage": "http://openshift.redhat.com/", 20 | "repository": { 21 | "type": "git", 22 | "url": "https://fill.in.later.com" 23 | }, 24 | "engines": { 25 | "node": "= 0.10", 26 | "npm": ">= 1.0.0" 27 | }, 28 | "dependencies": { 29 | "mongodb" : "1.3.20" , 30 | "express" : "3.4.7" 31 | }, 32 | "devDependencies": {}, 33 | "bundleDependencies": [], 34 | "private": true, 35 | "main": "server.js" 36 | } 37 | -------------------------------------------------------------------------------- /parkcoord.json: -------------------------------------------------------------------------------- 1 | { "Name" : "Abraham Lincoln Birthplace National Historical Park", "pos" : [-85.7302 , 37.5332 ] } 2 | { "Name" : "Abraham Lincoln National Cemetery", "pos" : [-88.12595 , 41.3896 ] } 3 | { "Name" : "Acadia National Park", "pos" : [-68.04902 , 44.454 ] } 4 | { "Name" : "Adams National Historical Park", "pos" : [-71.01119 , 42.25639 ] } 5 | { "Name" : "Admiralty Island National Monument", "pos" : [-134.16105 , 57.61806 ] } 6 | { "Name" : "African American Civil War Memorial", "pos" : [-77.02569 , 38.91639 ] } 7 | { "Name" : "African Burial Ground National Monument", "pos" : [-73.99364 , 40.71367 ] } 8 | { "Name" : "Agate Fossil Beds National Monument", "pos" : [-103.75492 , 42.42428 ] } 9 | { "Name" : "Agua Fria National Monument", "pos" : [-112.07633 , 34.15417 ] } 10 | { "Name" : "AIDS Memorial Grove", "pos" : [-122.46122 , 37.77 ] } 11 | { "Name" : "Ala Kahakai National Historic Trail", "pos" : [-155.68106 , 18.91111 ] } 12 | { "Name" : "Alagnak River", "pos" : [-156.79582 , 59.01063 ] } 13 | { "Name" : "Aleutian World War II National Historic Area", "pos" : [-166.52692 , 53.88889 ] } 14 | { "Name" : "Alibates Flint Quarries National Monument", "pos" : [-101.66722 , 35.57139 ] } 15 | { "Name" : "Allegheny Portage Railroad", "pos" : [-78.5401 , 40.45417 ] } 16 | { "Name" : "American Memorial Park", "pos" : [145.71691 , 15.2181 ] } 17 | { "Name" : "Amistad National Recreation Area", "pos" : [-101.04972 , 29.43667 ] } 18 | { "Name" : "Anacostia Park", "pos" : [-76.89998 , 38.8 ] } 19 | { "Name" : "Andersonville National Cemetery", "pos" : [-84.13093 , 32.20358 ] } 20 | { "Name" : "Andersonville National Historic Site", "pos" : [-84.12686 , 32.19759 ] } 21 | { "Name" : "Andrew Johnson National Cemetery", "pos" : [-82.83763 , 36.15527 ] } 22 | { "Name" : "Andrew Johnson National Historic Site", "pos" : [-82.83482 , 36.15833 ] } 23 | { "Name" : "Aniakchak National Monument and Preserve", "pos" : [-158.14972 , 56.9 ] } 24 | { "Name" : "Antietam National Battlefield", "pos" : [-77.73945 , 39.4803 ] } 25 | { "Name" : "Antietam National Cemetery", "pos" : [-77.73904 , 39.47914 ] } 26 | { "Name" : "Apostle Islands National Lakeshore", "pos" : [-90.66402 , 46.96528 ] } 27 | { "Name" : "Appomattox Court House National Historical Park", "pos" : [-78.80083 , 37.37845 ] } 28 | { "Name" : "Arches National Park", "pos" : [-109.56462 , 38.77 ] } 29 | { "Name" : "Arkansas Post National Memorial", "pos" : [-91.34347 , 34.02361 ] } 30 | { "Name" : "Arlington House The Robert E. Lee Memorial", "pos" : [-77.07389 , 38.88275 ] } 31 | { "Name" : "Arlington National Cemetery", "pos" : [-77.07122 , 38.87657 ] } 32 | { "Name" : "Assateague Island National Seashore", "pos" : [-75.20818 , 38.08332 ] } 33 | { "Name" : "Aulavik National Park", "pos" : [-119.74092 , 74.02249 ] } 34 | { "Name" : "Auyuittuq National Park", "pos" : [-65.01638 , 67.88333 ] } 35 | { "Name" : "Aztec Ruins National Monument", "pos" : [-107.99782 , 36.83583 ] } 36 | { "Name" : "Badlands National Park", "pos" : [-102.43392 , 43.6504 ] } 37 | { "Name" : "Bandelier National Monument", "pos" : [-106.32082 , 35.77888 ] } 38 | { "Name" : "Banff National Park", "pos" : [-115.54962 , 51.16666 ] } 39 | { "Name" : "Battleground National Cemetery", "pos" : [-73.96286 , 40.81333 ] } 40 | { "Name" : "Benjamin Franklin National Memorial", "pos" : [-75.17286 , 39.95832 ] } 41 | { "Name" : "Bent's Old Fort National Historic Site", "pos" : [-103.42502 , 38.04045 ] } 42 | { "Name" : "Bering Land Bridge National Preserve", "pos" : [-164.80842 , 66.05595 ] } 43 | { "Name" : "Big Bend National Park", "pos" : [-103.06042 , 29.81874 ] } 44 | { "Name" : "Big Cypress National Preserve", "pos" : [-81.0337 , 25.85889 ] } 45 | { "Name" : "Big Hole National Battlefield", "pos" : [-113.64332 , 45.6375 ] } 46 | { "Name" : "Big South Fork National River and Recreation Area", "pos" : [-84.69835 , 36.4865 ] } 47 | { "Name" : "Big Thicket National Preserve", "pos" : [-94.41082 , 30.27567 ] } 48 | { "Name" : "Bighorn Canyon National Recreation Area", "pos" : [-108.13032 , 45.19444 ] } 49 | { "Name" : "Biscayne National Park", "pos" : [-80.26162 , 25.442 ] } 50 | { "Name" : "Black Canyon of the Gunnison National Park", "pos" : [-107.72792 , 38.58491 ] } 51 | { "Name" : "Blue Ridge Parkway", "pos" : [-80.93578 , 36.51861 ] } 52 | { "Name" : "Bluestone National Scenic River", "pos" : [-80.99901 , 37.54167 ] } 53 | { "Name" : "Booker T. Washington National Monument", "pos" : [-79.76564 , 37.12333 ] } 54 | { "Name" : "Boston African American National Historic Site", "pos" : [-71.06454 , 42.36 ] } 55 | { "Name" : "Boston Harbor Islands National Recreation Area", "pos" : [-70.94565 , 42.31861 ] } 56 | { "Name" : "Boston National Historical Park", "pos" : [-71.05617 , 42.36 ] } 57 | { "Name" : "Brices Cross Roads National Battlefield Site", "pos" : [-88.7284 , 34.50672 ] } 58 | { "Name" : "Brown v. Board of Education National Historic Site", "pos" : [-95.67621 , 39.03806 ] } 59 | { "Name" : "Bruce Peninsula National Park", "pos" : [-81.61388 , 45.23888 ] } 60 | { "Name" : "Bryce Canyon National Park", "pos" : [-112.19632 , 37.5548 ] } 61 | { "Name" : "Buck Island Reef National Monument", "pos" : [-64.61897 , 17.78694 ] } 62 | { "Name" : "Buffalo National River", "pos" : [-92.42606 , 36.17806 ] } 63 | { "Name" : "Cabrillo National Monument", "pos" : [-117.24202 , 32.67352 ] } 64 | { "Name" : "California Coastal National Monument", "pos" : [-122.17994 , 36.89 ] } 65 | { "Name" : "Canaveral National Seashore", "pos" : [-80.77679 , 28.7675 ] } 66 | { "Name" : "Cane River Creole National Historical Park", "pos" : [-93.00343 , 31.66684 ] } 67 | { "Name" : "Canyon de Chelly National Monument", "pos" : [-109.46912 , 36.1336 ] } 68 | { "Name" : "Canyonlands National Park", "pos" : [-109.88072 , 38.261 ] } 69 | { "Name" : "Canyons of the Ancients National Monument", "pos" : [-108.99994 , 37.37 ] } 70 | { "Name" : "Cape Breton Highlands National Park", "pos" : [-60.8111 , 46.81611 ] } 71 | { "Name" : "Cape Cod National Seashore", "pos" : [-70.20513 , 42.07389 ] } 72 | { "Name" : "Cape Hatteras National Seashore", "pos" : [-75.51123 , 35.30361 ] } 73 | { "Name" : "Cape Henry Memorial", "pos" : [-76.00819 , 36.92806 ] } 74 | { "Name" : "Cape Krusenstern National Monument", "pos" : [-163.50002 , 67.41333 ] } 75 | { "Name" : "Cape Lookout National Seashore", "pos" : [-76.53624 , 34.60528 ] } 76 | { "Name" : "Capitol Reef National Park", "pos" : [-111.23862 , 38.27617 ] } 77 | { "Name" : "Captain John Smith Chesapeake National Historic Trail", "pos" : [-75.99995 , 38 ] } 78 | { "Name" : "Capulin Volcano National Monument", "pos" : [-103.96972 , 36.78222 ] } 79 | { "Name" : "Carl Sandburg Home National Historic Site", "pos" : [-82.45149 , 35.26778 ] } 80 | { "Name" : "Carlsbad Caverns National Park", "pos" : [-104.40902 , 32.1648 ] } 81 | { "Name" : "Carrizo Plain", "pos" : [-119.74994 , 35.16 ] } 82 | { "Name" : "Carter G. Woodson Home National Historic Site", "pos" : [-77.02399 , 38.90999 ] } 83 | { "Name" : "Casa Grande Ruins National Monument", "pos" : [-111.53162 , 32.99517 ] } 84 | { "Name" : "Cascade-Siskiyou National Monument", "pos" : [-122.46105 , 42.07778 ] } 85 | { "Name" : "Castillo de San Marcos National Monument", "pos" : [-81.31153 , 29.89775 ] } 86 | { "Name" : "Castle Clinton National Monument", "pos" : [-74.01674 , 40.7036 ] } 87 | { "Name" : "Catoctin Mountain Park", "pos" : [-77.46665 , 39.64833 ] } 88 | { "Name" : "Cedar Breaks National Monument", "pos" : [-112.84612 , 37.64519 ] } 89 | { "Name" : "Cedar Creek and Belle Grove National Historical Park", "pos" : [-78.30063 , 39.16749 ] } 90 | { "Name" : "Chaco Culture National Historical Park", "pos" : [-107.95862 , 36.05833 ] } 91 | { "Name" : "Chalmette National Cemetery", "pos" : [-89.98648 , 29.94417 ] } 92 | { "Name" : "Chamizal National Memorial", "pos" : [-106.45402 , 31.76778 ] } 93 | { "Name" : "Channel Islands National Park", "pos" : [-119.74212 , 34.0394 ] } 94 | { "Name" : "Charles Pinckney National Historic Site", "pos" : [-79.82454 , 32.84611 ] } 95 | { "Name" : "Chattahoochee River National Recreation Area", "pos" : [-84.32454 , 33.98722 ] } 96 | { "Name" : "Chesapeake and Ohio Canal National Historical Park", "pos" : [-77.05744 , 38.89972 ] } 97 | { "Name" : "Chicago Portage National Historic Site", "pos" : [-87.80676 , 41.80556 ] } 98 | { "Name" : "Chickamauga and Chattanooga National Military Park", "pos" : [-85.25984 , 34.94 ] } 99 | { "Name" : "Chickasaw National Recreation Area", "pos" : [-96.97204 , 34.50056 ] } 100 | { "Name" : "Chimney Rock National Historic Site", "pos" : [-103.34792 , 41.70368 ] } 101 | { "Name" : "Chiricahua National Monument", "pos" : [-109.34802 , 32.01778 ] } 102 | { "Name" : "Christiansted National Historic Site", "pos" : [-64.70204 , 17.74693 ] } 103 | { "Name" : "City of Rocks National Reserve", "pos" : [-113.70366 , 42.07727 ] } 104 | { "Name" : "Clara Barton National Historic Site", "pos" : [-77.14065 , 38.96694 ] } 105 | { "Name" : "Colonial National Historical Park", "pos" : [-76.5084 , 37.21926 ] } 106 | { "Name" : "Colonial Parkway", "pos" : [-76.71576 , 37.21557 ] } 107 | { "Name" : "Colorado National Monument", "pos" : [-108.68582 , 39.04249 ] } 108 | { "Name" : "Congaree National Park", "pos" : [-80.78308 , 33.78333 ] } 109 | { "Name" : "Coronado National Memorial", "pos" : [-110.25602 , 31.3455 ] } 110 | { "Name" : "Cowpens National Battlefield", "pos" : [-81.8179 , 35.13667 ] } 111 | { "Name" : "Crater Lake National Park", "pos" : [-122.10872 , 42.943 ] } 112 | { "Name" : "Craters of the Moon National Monument and Preserve", "pos" : [-113.51642 , 43.41667 ] } 113 | { "Name" : "Cumberland Gap National Historical Park", "pos" : [-83.68703 , 36.60417 ] } 114 | { "Name" : "Cumberland Island National Seashore", "pos" : [-81.44985 , 30.83333 ] } 115 | { "Name" : "Curecanti National Recreation Area", "pos" : [-107.32672 , 38.45472 ] } 116 | { "Name" : "Custer National Cemetery", "pos" : [-107.43165 , 45.56953 ] } 117 | { "Name" : "Cuyahoga Valley National Park", "pos" : [-81.55677 , 41.20906 ] } 118 | { "Name" : "David Berger National Memorial", "pos" : [-81.49236 , 41.47472 ] } 119 | { "Name" : "Dayton Aviation Heritage National Historical Park", "pos" : [-84.0887 , 39.79472 ] } 120 | { "Name" : "De Soto National Memorial", "pos" : [-82.64429 , 27.52389 ] } 121 | { "Name" : "Death Valley National Park", "pos" : [-117.09872 , 36.524 ] } 122 | { "Name" : "Delaware Water Gap National Recreation Area", "pos" : [-75.01726 , 41.08232 ] } 123 | { "Name" : "Delaware Water Gap National Recreation Area", "pos" : [-75.00416 , 41.08996 ] } 124 | { "Name" : "Delaware Water Gap National Recreation Area", "pos" : [-74.89562 , 41.14625 ] } 125 | { "Name" : "Delaware Water Gap National Recreation Area", "pos" : [-74.80594 , 41.30989 ] } 126 | { "Name" : "Delaware Water Gap National Recreation Area Boat Launch", "pos" : [-74.98472 , 41.10718 ] } 127 | { "Name" : "Delaware Water Gap NRA Store & Campground", "pos" : [-74.87387 , 41.21144 ] } 128 | { "Name" : "Denali National Park", "pos" : [-149.98632 , 63.54357 ] } 129 | { "Name" : "Denali National Park and Preserve", "pos" : [-150.49972 , 63.33333 ] } 130 | { "Name" : "Devils Postpile National Monument", "pos" : [-119.08412 , 37.62444 ] } 131 | { "Name" : "Devils Tower National Monument", "pos" : [-104.71502 , 44.59028 ] } 132 | { "Name" : "Dinosaur National Monument", "pos" : [-108.98302 , 40.53333 ] } 133 | { "Name" : "Dry Tortugas National Park", "pos" : [-81.7859 , 24.6384 ] } 134 | { "Name" : "East Potomac Park", "pos" : [-77.0259 , 38.87 ] } 135 | { "Name" : "Ebey's Landing National Historical Reserve", "pos" : [-122.68951 , 48.21341 ] } 136 | { "Name" : "Edgar Allan Poe National Historic Site", "pos" : [-75.15011 , 39.96167 ] } 137 | { "Name" : "Effigy Mounds National Monument", "pos" : [-91.18537 , 43.08861 ] } 138 | { "Name" : "Eisenhower National Historic Site", "pos" : [-77.26316 , 39.79332 ] } 139 | { "Name" : "El Malpais National Monument", "pos" : [-107.95752 , 34.87635 ] } 140 | { "Name" : "El Morro National Monument", "pos" : [-108.35302 , 35.03833 ] } 141 | { "Name" : "Eleanor Roosevelt National Historic Site", "pos" : [-73.93511 , 41.78582 ] } 142 | { "Name" : "Elk Island National Park", "pos" : [-112.87042 , 53.59277 ] } 143 | { "Name" : "Ellis Island National Monument", "pos" : [-74.03937 , 40.69956 ] } 144 | { "Name" : "Eugene O'Neill National Historic Site", "pos" : [-122.02942 , 37.82444 ] } 145 | { "Name" : "Everglades National Park", "pos" : [-80.79976 , 25.36 ] } 146 | { "Name" : "Father Marquette National Memorial", "pos" : [-84.71708 , 45.85167 ] } 147 | { "Name" : "Federal Hall", "pos" : [-74.01014 , 40.70722 ] } 148 | { "Name" : "Fire Island National Seashore", "pos" : [-72.98263 , 40.69639 ] } 149 | { "Name" : "First Ladies National Historic Site", "pos" : [-81.37511 , 40.79667 ] } 150 | { "Name" : "Flight 93 National Memorial", "pos" : [-78.9076 , 40.05615 ] } 151 | { "Name" : "Florissant Fossil Beds National Monument", "pos" : [-105.26744 , 38.91806 ] } 152 | { "Name" : "Ford's Theatre National Historic Site", "pos" : [-77.02563 , 38.89667 ] } 153 | { "Name" : "Forillon National Park", "pos" : [-64.29027 , 48.82388 ] } 154 | { "Name" : "Fort Bowie National Historic Site", "pos" : [-109.43542 , 32.14611 ] } 155 | { "Name" : "Fort Caroline National Memorial", "pos" : [-81.50042 , 30.38694 ] } 156 | { "Name" : "Fort Davis National Historic Site", "pos" : [-103.92562 , 30.59583 ] } 157 | { "Name" : "Fort Donelson National Battlefield", "pos" : [-87.85736 , 36.48438 ] } 158 | { "Name" : "Fort Donelson National Cemetery", "pos" : [-87.84766 , 36.48525 ] } 159 | { "Name" : "Fort Dupont Park", "pos" : [-76.94947 , 38.8766 ] } 160 | { "Name" : "Fort Foote Park", "pos" : [-77.02778 , 38.7667 ] } 161 | { "Name" : "Fort Frederica National Monument", "pos" : [-81.39313 , 31.22389 ] } 162 | { "Name" : "Fort Laramie National Historic Site", "pos" : [-104.53562 , 42.20917 ] } 163 | { "Name" : "Fort Larned National Historic Site", "pos" : [-99.2265 , 38.15667 ] } 164 | { "Name" : "Fort Matanzas National Monument", "pos" : [-81.23898 , 29.71528 ] } 165 | { "Name" : "Fort McHenry National Monument and Historic Shrine", "pos" : [-76.57981 , 39.26306 ] } 166 | { "Name" : "Fort Necessity National Battlefield", "pos" : [-79.59956 , 39.81667 ] } 167 | { "Name" : "Fort Point National Historic Site", "pos" : [-122.47692 , 37.81056 ] } 168 | { "Name" : "Fort Pulaski National Monument", "pos" : [-80.89008 , 32.02722 ] } 169 | { "Name" : "Fort Raleigh National Historic Site", "pos" : [-75.70872 , 35.93833 ] } 170 | { "Name" : "Fort Scott National Historic Site", "pos" : [-94.70455 , 37.84389 ] } 171 | { "Name" : "Fort Smith National Historic Site", "pos" : [-94.42261 , 35.34333 ] } 172 | { "Name" : "Fort Stanwix National Monument", "pos" : [-75.45506 , 43.21056 ] } 173 | { "Name" : "Fort Sumter National Monument", "pos" : [-79.87453 , 32.75222 ] } 174 | { "Name" : "Fort Union National Monument", "pos" : [-105.01802 , 35.90722 ] } 175 | { "Name" : "Fort Union Trading Post National Historic Site", "pos" : [-104.04032 , 47.99944 ] } 176 | { "Name" : "Fort Vancouver National Historic Site", "pos" : [-122.65792 , 45.6254 ] } 177 | { "Name" : "Fort Washington National Park", "pos" : [-77.03304 , 38.71083 ] } 178 | { "Name" : "Fossil Butte National Monument", "pos" : [-110.76762 , 41.85875 ] } 179 | { "Name" : "Franklin Delano Roosevelt Memorial", "pos" : [-77.0443 , 38.88389 ] } 180 | { "Name" : "Frederick Douglass National Historic Site", "pos" : [-76.98511 , 38.86333 ] } 181 | { "Name" : "Frederick Law Olmsted National Historic Site", "pos" : [-71.13205 , 42.325 ] } 182 | { "Name" : "Fredericksburg and Spotsylvania National Military Park", "pos" : [-77.46901 , 38.29305 ] } 183 | { "Name" : "Fredericksburg National Cemetery", "pos" : [-77.46884 , 38.29307 ] } 184 | { "Name" : "Friendship Hill National Historic Site", "pos" : [-79.92899 , 39.77778 ] } 185 | { "Name" : "Fundy National Park", "pos" : [-64.9536 , 45.59527 ] } 186 | { "Name" : "Gates of the Arctic National Park and Preserve", "pos" : [-153.29972 , 67.78333 ] } 187 | { "Name" : "Gateway National Recreation Area - Breezy Point", "pos" : [-73.92607 , 40.5565 ] } 188 | { "Name" : "Gateway National Recreation Area - Floyd Bennett Field", "pos" : [-73.89082 , 40.591 ] } 189 | { "Name" : "Gateway National Recreation Area - Fort Hancock", "pos" : [-74.00259 , 40.46389 ] } 190 | { "Name" : "Gateway National Recreation Area - Fort Tilden", "pos" : [-73.89093 , 40.56389 ] } 191 | { "Name" : "Gateway National Recreation Area - Fort Wadsworth", "pos" : [-74.06232 , 40.60833 ] } 192 | { "Name" : "Gateway National Recreation Area - Great Kills Park", "pos" : [-74.12715 , 40.55542 ] } 193 | { "Name" : "Gateway National Recreation Area - Jacob Riis Park", "pos" : [-73.87395 , 40.56702 ] } 194 | { "Name" : "Gateway National Recreation Area - Jamaica Bay", "pos" : [-73.84231 , 40.61778 ] } 195 | { "Name" : "Gateway National Recreation Area - Miller Field", "pos" : [-74.09538 , 40.56416 ] } 196 | { "Name" : "Gateway National Recreation Area - Sandy Hook", "pos" : [-73.99506 , 40.45288 ] } 197 | { "Name" : "Gauley River National Recreation Area", "pos" : [-80.88982 , 38.22 ] } 198 | { "Name" : "General Grant National Memorial", "pos" : [-73.96285 , 40.81333 ] } 199 | { "Name" : "George Mason Memorial", "pos" : [-77.03903 , 38.87944 ] } 200 | { "Name" : "George Rogers Clark National Historical Park", "pos" : [-87.5354 , 38.67919 ] } 201 | { "Name" : "George Washington Birthplace National Monument", "pos" : [-76.93036 , 38.18611 ] } 202 | { "Name" : "George Washington Carver National Monument", "pos" : [-94.354 , 36.98636 ] } 203 | { "Name" : "George Washington Memorial Parkway", "pos" : [-77.10217 , 38.91111 ] } 204 | { "Name" : "Georgian Bay Islands National Park", "pos" : [-79.87444 , 44.87777 ] } 205 | { "Name" : "Gettysburg National Cemetery", "pos" : [-77.23124 , 39.82027 ] } 206 | { "Name" : "Gettysburg National Military Park", "pos" : [-77.24615 , 39.81206 ] } 207 | { "Name" : "Giant Sequoia National Monument", "pos" : [-118.50438 , 36.04 ] } 208 | { "Name" : "Gila Cliff Dwellings National Monument", "pos" : [-108.27192 , 33.22722 ] } 209 | { "Name" : "Glacier Bay National Park", "pos" : [-135.75552 , 58.41543 ] } 210 | { "Name" : "Glacier Bay National Park and Preserve", "pos" : [-136.99996 , 58.5 ] } 211 | { "Name" : "Glacier National Park", "pos" : [-113.77572 , 48.692 ] } 212 | { "Name" : "Glen Canyon National Recreation Area", "pos" : [-111.48672 , 36.9936 ] } 213 | { "Name" : "Gloria Dei (Old Swedes') Church", "pos" : [-75.14342 , 39.93444 ] } 214 | { "Name" : "Golden Gate National Recreation Area", "pos" : [-122.46652 , 37.78333 ] } 215 | { "Name" : "Golden Gate National Recreation Area-Alcatraz Island", "pos" : [-122.42322 , 37.82667 ] } 216 | { "Name" : "Golden Gate National Recreation Area-Presidio", "pos" : [-122.46572 , 37.79806 ] } 217 | { "Name" : "Golden Spike National Historic Site", "pos" : [-112.54722 , 41.62048 ] } 218 | { "Name" : "Governors Island National Monument", "pos" : [-74.01589 , 40.69139 ] } 219 | { "Name" : "Grand Canyon", "pos" : [-112.13722 , 36.05749 ] } 220 | { "Name" : "Grand Canyon - North Rim", "pos" : [-113.19712 , 36 ] } 221 | { "Name" : "Grand Canyon - South Rim National Park", "pos" : [-112.11732 , 36.06501 ] } 222 | { "Name" : "Grand Canyon National Park", "pos" : [-112.13745 , 36.0575 ] } 223 | { "Name" : "Grand Canyon West Airport", "pos" : [-113.81612 , 35.99038 ] } 224 | { "Name" : "Grand Canyon-Parashant National Monument", "pos" : [-113.69972 , 36.4 ] } 225 | { "Name" : "Grand Portage National Monument", "pos" : [-89.74898 , 47.98528 ] } 226 | { "Name" : "Grand Staircase-Escalante National Monument", "pos" : [-111.68327 , 37.4 ] } 227 | { "Name" : "Grand Teton National Park", "pos" : [-110.78822 , 43.7403 ] } 228 | { "Name" : "Grant-Kohrs Ranch National Historic Site", "pos" : [-112.73922 , 46.40833 ] } 229 | { "Name" : "Grasslands National Park", "pos" : [-107.42542 , 49.17694 ] } 230 | { "Name" : "Great Basin National Park", "pos" : [-114.26082 , 38.93873 ] } 231 | { "Name" : "Great Egg Harbor Scenic and Recreational River", "pos" : [-74.64957 , 39.30417 ] } 232 | { "Name" : "Great Sand Dunes National Park", "pos" : [-105.54172 , 37.7539 ] } 233 | { "Name" : "Great Sand Dunes National Park and Preserve", "pos" : [-105.51182 , 37.73287 ] } 234 | { "Name" : "Great Smoky Mountains National Park", "pos" : [-83.16773 , 35.72715 ] } 235 | { "Name" : "Greenbelt Park", "pos" : [-76.89831 , 38.98917 ] } 236 | { "Name" : "Gros Morne National Park", "pos" : [-57.78305 , 49.5 ] } 237 | { "Name" : "Guadalupe Mountains National Park", "pos" : [-104.85962 , 31.916 ] } 238 | { "Name" : "Guilford Courthouse National Military Park", "pos" : [-79.84623 , 36.13139 ] } 239 | { "Name" : "Gulf Islands National Park Reserve", "pos" : [-123.44732 , 48.85055 ] } 240 | { "Name" : "Gulf Islands National Seashore", "pos" : [-86.96735 , 30.36444 ] } 241 | { "Name" : "Gwaii Haanas Park Reserve and Haida Heritage Site", "pos" : [-131.47072 , 52.38916 ] } 242 | { "Name" : "Hagerman Fossil Beds National Monument", "pos" : [-114.94502 , 42.79028 ] } 243 | { "Name" : "Haleakala National Park", "pos" : [-156.21002 , 20.71062 ] } 244 | { "Name" : "Hamilton Grange National Memorial", "pos" : [-73.94815 , 40.82238 ] } 245 | { "Name" : "Hampton National Historic Site", "pos" : [-76.58734 , 39.41611 ] } 246 | { "Name" : "Hanford Reach National Monument", "pos" : [-119.51661 , 46.58333 ] } 247 | { "Name" : "Harmony Hall Fort Washington Maryland", "pos" : [-77.00304 , 38.74583 ] } 248 | { "Name" : "Harpers Ferry National Historical Park", "pos" : [-77.72952 , 39.32278 ] } 249 | { "Name" : "Harry S. Truman National Historic Site", "pos" : [-94.53209 , 38.90211 ] } 250 | { "Name" : "Hawaii Volcanoes National Park", "pos" : [-155.29962 , 19.39999 ] } 251 | { "Name" : "Herbert Hoover National Historic Site", "pos" : [-91.3479 , 41.66861 ] } 252 | { "Name" : "Historic Camden Revolutionary War Site", "pos" : [-80.60317 , 34.23389 ] } 253 | { "Name" : "Historic Jamestowne", "pos" : [-76.77873 , 37.20971 ] } 254 | { "Name" : "Hohokam Pima National Monument", "pos" : [-111.92642 , 33.15444 ] } 255 | { "Name" : "Home of Franklin D. Roosevelt National Historic Site", "pos" : [-73.93539 , 41.76721 ] } 256 | { "Name" : "Homestead National Monument of America", "pos" : [-96.82172 , 40.28525 ] } 257 | { "Name" : "Honokohau National Historical Park", "pos" : [-156.02172 , 19.6787 ] } 258 | { "Name" : "Hopewell Culture National Historical Park", "pos" : [-83.0062 , 39.37583 ] } 259 | { "Name" : "Hopewell Furnace National Historic Site", "pos" : [-75.7754 , 40.19861 ] } 260 | { "Name" : "Horseshoe Bend National Military Park", "pos" : [-85.73817 , 32.97083 ] } 261 | { "Name" : "Hot Springs National Park", "pos" : [-92.95843 , 34.52684 ] } 262 | { "Name" : "Hovenweep National Monument", "pos" : [-109.07702 , 37.38388 ] } 263 | { "Name" : "Hubbell Trading Post National Historic Site", "pos" : [-109.59312 , 35.72556 ] } 264 | { "Name" : "Independence Hall", "pos" : [-75.1498 , 39.94889 ] } 265 | { "Name" : "Independence National Historical Park", "pos" : [-75.14787 , 39.94778 ] } 266 | { "Name" : "Indiana Dunes National Lakeshore", "pos" : [-87.10791 , 41.64806 ] } 267 | { "Name" : "International Peace Garden", "pos" : [-100.06432 , 48.99098 ] } 268 | { "Name" : "Inupiat Heritage Center", "pos" : [-156.75331 , 71.29861 ] } 269 | { "Name" : "Ironwood Forest National Monument", "pos" : [-111.56673 , 32.45896 ] } 270 | { "Name" : "Isle Royale National Park", "pos" : [-88.89144 , 47.9624 ] } 271 | { "Name" : "Ivvavik National Park", "pos" : [-139.52462 , 69.51972 ] } 272 | { "Name" : "James A. Garfield National Historic Site", "pos" : [-81.34706 , 41.66222 ] } 273 | { "Name" : "Jasper National Park", "pos" : [-118.08182 , 52.87305 ] } 274 | { "Name" : "Jean Lafitte National Historical Park and Preserve", "pos" : [-89.99398 , 29.9425 ] } 275 | { "Name" : "Jefferson National Expansion Memorial", "pos" : [-90.18483 , 38.6246 ] } 276 | { "Name" : "Jewel Cave National Monument", "pos" : [-103.82912 , 43.72944 ] } 277 | { "Name" : "Jimmy Carter National Historic Site", "pos" : [-84.39984 , 32.03389 ] } 278 | { "Name" : "John D. Rockefeller Jr. Memorial Parkway", "pos" : [-110.69273 , 44.10472 ] } 279 | { "Name" : "John Day Fossil Beds National Monument", "pos" : [-119.63412 , 44.54987 ] } 280 | { "Name" : "John Ericsson National Memorial", "pos" : [-77.05014 , 38.88667 ] } 281 | { "Name" : "John Fitzgerald Kennedy National Historic Site", "pos" : [-71.12428 , 42.34583 ] } 282 | { "Name" : "John Muir National Historic Site", "pos" : [-122.13302 , 37.99131 ] } 283 | { "Name" : "Johnstown Flood National Memorial", "pos" : [-78.77847 , 40.34556 ] } 284 | { "Name" : "Joshua Tree National Park", "pos" : [-115.82762 , 33.843 ] } 285 | { "Name" : "Kalaupapa Leprosy Settlement and National Historical Park", "pos" : [-156.95972 , 21.17778 ] } 286 | { "Name" : "Kasha-Katuwe Tent Rocks National Monument", "pos" : [-106.41912 , 35.6736 ] } 287 | { "Name" : "Kate Mullany National Historic Site", "pos" : [-73.68163 , 42.7399 ] } 288 | { "Name" : "Katmai National Park", "pos" : [-154.88652 , 58.58305 ] } 289 | { "Name" : "Katmai National Park and Preserve", "pos" : [-154.99972 , 58.5 ] } 290 | { "Name" : "Kejimkujik National Park", "pos" : [-65.21805 , 44.39916 ] } 291 | { "Name" : "Kenai Fjords National Park", "pos" : [-149.64982 , 59.91666 ] } 292 | { "Name" : "Kenilworth Park and Aquatic Gardens", "pos" : [-76.94771 , 38.90833 ] } 293 | { "Name" : "Kennesaw Mountain National Battlefield Park", "pos" : [-84.5779 , 33.98306 ] } 294 | { "Name" : "Keweenaw National Historical Park", "pos" : [-88.4537 , 47.24667 ] } 295 | { "Name" : "Kings Canyon National Park", "pos" : [-118.64062 , 36.81199 ] } 296 | { "Name" : "Kings Mountain National Military Park", "pos" : [-81.38928 , 35.13778 ] } 297 | { "Name" : "Klondike Gold Rush National Historical Park", "pos" : [-135.31162 , 59.45639 ] } 298 | { "Name" : "Kluane National Park and Reserve", "pos" : [-137.50982 , 60.75305 ] } 299 | { "Name" : "Knife River Indian Villages National Historic Site", "pos" : [-101.38562 , 47.35417 ] } 300 | { "Name" : "Kobuk Valley National Park", "pos" : [-159.13662 , 67.34408 ] } 301 | { "Name" : "Kootenay National Park", "pos" : [-116.04872 , 50.88305 ] } 302 | { "Name" : "Korean War Veterans Memorial", "pos" : [-77.047 , 38.88778 ] } 303 | { "Name" : "Kouchibouguac National Park", "pos" : [-64.96666 , 46.84972 ] } 304 | { "Name" : "La Mauricie National Park", "pos" : [-72.85583 , 46.80805 ] } 305 | { "Name" : "Lake Chelan National Recreation Area", "pos" : [-120.67802 , 48.32194 ] } 306 | { "Name" : "Lake Clark National Park", "pos" : [-154.32362 , 60.19943 ] } 307 | { "Name" : "Lake Clark National Park and Preserve", "pos" : [-153.41642 , 60.96667 ] } 308 | { "Name" : "Lake Mead National Recreation Area", "pos" : [-113.69972 , 36.4 ] } 309 | { "Name" : "Lake Mead National Recreation Area", "pos" : [-114.79642 , 36.00972 ] } 310 | { "Name" : "Lake Meredith National Recreation Area", "pos" : [-101.55252 , 35.71472 ] } 311 | { "Name" : "Lake Roosevelt National Recreation Area", "pos" : [-118.98032 , 47.95611 ] } 312 | { "Name" : "Lassen Volcanic National Park", "pos" : [-121.41452 , 40.48297 ] } 313 | { "Name" : "Lava Beds National Monument", "pos" : [-121.50802 , 41.71389 ] } 314 | { "Name" : "Lewis and Clark National and State Historical Parks", "pos" : [-123.87722 , 46.13361 ] } 315 | { "Name" : "Lewis and Clark National Historic Trail", "pos" : [-108.00939 , 46.00361 ] } 316 | { "Name" : "Liberty Memorial", "pos" : [-94.58606 , 39.08044 ] } 317 | { "Name" : "Lincoln Boyhood National Memorial", "pos" : [-86.9968 , 38.11833 ] } 318 | { "Name" : "Lincoln Home National Historic Site", "pos" : [-89.64484 , 39.79722 ] } 319 | { "Name" : "Lincoln Memorial", "pos" : [-77.04992 , 38.8893 ] } 320 | { "Name" : "Little Bighorn Battlefield National Monument", "pos" : [-107.42722 , 45.57028 ] } 321 | { "Name" : "Little River Canyon National Preserve", "pos" : [-85.59536 , 34.44056 ] } 322 | { "Name" : "Little Rock Central High School National Historic Site", "pos" : [-92.29845 , 34.73666 ] } 323 | { "Name" : "Longfellow National Historic Site", "pos" : [-71.12623 , 42.37667 ] } 324 | { "Name" : "Lowell National Historical Park", "pos" : [-71.31008 , 42.64667 ] } 325 | { "Name" : "Lower East Side Tenement National Historic Site", "pos" : [-73.98997 , 40.7185 ] } 326 | { "Name" : "Lyndon B. Johnson National Historical Park", "pos" : [-98.62398 , 30.24083 ] } 327 | { "Name" : "Lyndon Baines Johnson Memorial Grove on the Potomac", "pos" : [-77.05125 , 38.87861 ] } 328 | { "Name" : "Maggie L. Walker National Historic Site", "pos" : [-77.4379 , 37.54778 ] } 329 | { "Name" : "Mammoth Cave National Park", "pos" : [-86.11403 , 37.1841 ] } 330 | { "Name" : "Manassas National Battlefield Park", "pos" : [-77.52151 , 38.81277 ] } 331 | { "Name" : "Manzanar National Historic Site", "pos" : [-118.15422 , 36.72833 ] } 332 | { "Name" : "Marianas Trench Marine National Monument", "pos" : [145 , 20 ] } 333 | { "Name" : "Marsh-Billings-Rockefeller National Historical Park", "pos" : [-72.52917 , 43.63125 ] } 334 | { "Name" : "Martin Luther King Jr National Memorial", "pos" : [-77.045124 , 38.885926 ] } 335 | { "Name" : "Martin Luther King Jr. National Historic Site", "pos" : [-84.37211 , 33.755 ] } 336 | { "Name" : "Martin Van Buren National Historic Site", "pos" : [-73.70405 , 42.36971 ] } 337 | { "Name" : "Mary McLeod Bethune Council House National Historic Site", "pos" : [-77.03012 , 38.90778 ] } 338 | { "Name" : "Meridian Hill Park", "pos" : [-77.03559 , 38.92124 ] } 339 | { "Name" : "Mesa Verde National Park", "pos" : [-108.50862 , 37.3192 ] } 340 | { "Name" : "Middle Delaware National Scenic River", "pos" : [-74.89984 , 41.15 ] } 341 | { "Name" : "Mingan Archipelago National Park Reserve", "pos" : [-63.57638 , 50.25472 ] } 342 | { "Name" : "Minidoka National Historic Site", "pos" : [-114.23202 , 42.63694 ] } 343 | { "Name" : "Minute Man National Historical Park", "pos" : [-71.29842 , 42.45306 ] } 344 | { "Name" : "Minuteman Missile National Historic Site", "pos" : [-102.16032 , 43.93111 ] } 345 | { "Name" : "Missouri National Recreational River", "pos" : [-97.39263 , 42.8625 ] } 346 | { "Name" : "Misty Fiords National Monument", "pos" : [-130.60716 , 55.62167 ] } 347 | { "Name" : "Mojave National Preserve", "pos" : [-115.71642 , 34.88333 ] } 348 | { "Name" : "Monocacy National Battlefield", "pos" : [-77.39192 , 39.37115 ] } 349 | { "Name" : "Montezuma Castle National Monument", "pos" : [-111.83972 , 34.61305 ] } 350 | { "Name" : "Moores Creek National Battlefield", "pos" : [-78.10928 , 34.45806 ] } 351 | { "Name" : "Morristown National Historical Park", "pos" : [-74.52842 , 40.76694 ] } 352 | { "Name" : "Mount Rainier National Park", "pos" : [-121.74982 , 46.85 ] } 353 | { "Name" : "Mount Revelstoke National Park", "pos" : [-118.06512 , 51.08583 ] } 354 | { "Name" : "Mount Rushmore National Memorial", "pos" : [-103.45952 , 43.87895 ] } 355 | { "Name" : "Mount St. Helens National Volcanic Monument", "pos" : [-122.18422 , 46.23317 ] } 356 | { "Name" : "Muir Woods National Monument", "pos" : [-122.58362 , 37.89889 ] } 357 | { "Name" : "Nahanni National Park Reserve", "pos" : [-123.59962 , 61.08333 ] } 358 | { "Name" : "Natchez National Historical Park", "pos" : [-91.38287 , 31.54333 ] } 359 | { "Name" : "Natchez Trace Trail", "pos" : [-88.08826 , 34.66772 ] } 360 | { "Name" : "National Constitution Center", "pos" : [-75.14876 , 39.95341 ] } 361 | { "Name" : "National Japanese Am. Memorial To Patriotism During WW II", "pos" : [-77.01034 , 38.89452 ] } 362 | { "Name" : "National Mall", "pos" : [-77.02339 , 38.89 ] } 363 | { "Name" : "National Park of American Samoa", "pos" : [-170.68512 , -14.25708 ] } 364 | { "Name" : "National World War II Memorial", "pos" : [-77.04029 , 38.8894 ] } 365 | { "Name" : "Natural Bridges National Monument", "pos" : [-110.01342 , 37.60138 ] } 366 | { "Name" : "Navajo National Monument", "pos" : [-110.53442 , 36.68417 ] } 367 | { "Name" : "New Bedford Whaling National Historical Park", "pos" : [-70.92314 , 41.63556 ] } 368 | { "Name" : "New Jersey Pinelands National Reserve", "pos" : [-74.74985 , 39.75 ] } 369 | { "Name" : "New Orleans Jazz National Historical Park", "pos" : [-90.06784 , 29.96306 ] } 370 | { "Name" : "New River Gorge National River", "pos" : [-81.08152 , 37.96083 ] } 371 | { "Name" : "Newberry National Volcanic Monument", "pos" : [-121.25188 , 43.69417 ] } 372 | { "Name" : "Nez Perce National Historical Park", "pos" : [-116.35912 , 46.14194 ] } 373 | { "Name" : "Nicodemus National Historic Site", "pos" : [-99.61734 , 39.39083 ] } 374 | { "Name" : "Ninety Six National Historic Site", "pos" : [-82.02428 , 34.14694 ] } 375 | { "Name" : "Niobrara National Scenic River", "pos" : [-100.31642 , 42.88333 ] } 376 | { "Name" : "Noatak National Preserve", "pos" : [-161.19972 , 68 ] } 377 | { "Name" : "North Cascades National Park", "pos" : [-121.18952 , 48.70643 ] } 378 | { "Name" : "Ocmulgee National Monument", "pos" : [-83.60814 , 32.83667 ] } 379 | { "Name" : "Oklahoma City National Memorial", "pos" : [-97.51708 , 35.47278 ] } 380 | { "Name" : "Old Post Office Pavilion", "pos" : [-77.02788 , 38.89398 ] } 381 | { "Name" : "Old Stone House", "pos" : [-77.06054 , 38.90556 ] } 382 | { "Name" : "Olympic National Park", "pos" : [-123.52162 , 47.799 ] } 383 | { "Name" : "Oregon Caves National Monument", "pos" : [-123.40692 , 42.09806 ] } 384 | { "Name" : "Organ Pipe Cactus National Park", "pos" : [-112.85752 , 32.04444 ] } 385 | { "Name" : "Oxon Cove Park and Oxon Hill Farm", "pos" : [-78.31665 , 37.08806 ] } 386 | { "Name" : "Ozark National Scenic Riverways", "pos" : [-91.27615 , 37.1907 ] } 387 | { "Name" : "Pacific Rim National Park Reserve", "pos" : [-124.76872 , 48.63611 ] } 388 | { "Name" : "Padre Island National Seashore", "pos" : [-97.36846 , 26.98444 ] } 389 | { "Name" : "Palo Alto Battlefield National Historical Park", "pos" : [-97.48037 , 26.02139 ] } 390 | { "Name" : "Papah?naumoku?kea Marine National Monument", "pos" : [-171.73327 , 25.7 ] } 391 | { "Name" : "Pea Ridge National Military Park", "pos" : [-94.03401 , 36.45444 ] } 392 | { "Name" : "Pecos National Historical Park", "pos" : [-105.68912 , 35.54999 ] } 393 | { "Name" : "Peirce Mill", "pos" : [-77.05192 , 38.94028 ] } 394 | { "Name" : "Pennsylvania Avenue National Historic Site", "pos" : [-77.02373 , 38.89361 ] } 395 | { "Name" : "Perry's Victory and International Peace Memorial", "pos" : [-82.81124 , 41.65417 ] } 396 | { "Name" : "Petersburg National Battlefield", "pos" : [-77.36123 , 37.21944 ] } 397 | { "Name" : "Petrified Forest National Park", "pos" : [-109.78332 , 35.06274 ] } 398 | { "Name" : "Petroglyph National Monument", "pos" : [-106.76162 , 35.13583 ] } 399 | { "Name" : "Pictured Rocks National Lakeshore", "pos" : [-86.31235 , 46.56222 ] } 400 | { "Name" : "Pinnacles National Monument", "pos" : [-121.16662 , 36.48693 ] } 401 | { "Name" : "Pipe Spring National Monument", "pos" : [-112.73692 , 36.86193 ] } 402 | { "Name" : "Pipestone National Monument", "pos" : [-96.32481 , 44.01333 ] } 403 | { "Name" : "Piscataway Park", "pos" : [-77.09276 , 38.67861 ] } 404 | { "Name" : "Point Pelee National Park", "pos" : [-82.51749 , 41.96416 ] } 405 | { "Name" : "Point Reyes National Seashore", "pos" : [-122.88502 , 38.06 ] } 406 | { "Name" : "Pompeys Pillar National Monument", "pos" : [-108.00577 , 45.99528 ] } 407 | { "Name" : "Poplar Grove National Cemetery", "pos" : [-77.42845 , 37.16028 ] } 408 | { "Name" : "Port Chicago Naval Magazine National Memorial", "pos" : [-122.02952 , 38.05749 ] } 409 | { "Name" : "Poverty Point National Monument", "pos" : [-91.40763 , 32.63904 ] } 410 | { "Name" : "Prehistoric Trackways National Monument", "pos" : [-106.89972 , 32.35 ] } 411 | { "Name" : "President Lincoln's Cottage at the Soldiers' Home", "pos" : [-77.01161 , 38.94167 ] } 412 | { "Name" : "President's Park (White House)", "pos" : [-77.03674 , 38.89417 ] } 413 | { "Name" : "Prince Albert National Park", "pos" : [-106.23322 , 53.99583 ] } 414 | { "Name" : "Prince Edward Island National Park", "pos" : [-63.07472 , 46.41666 ] } 415 | { "Name" : "Prince William Forest Park", "pos" : [-77.3797 , 38.58528 ] } 416 | { "Name" : "Pu'uhonua o Honaunau National Historical Park", "pos" : [-155.91002 , 19.42194 ] } 417 | { "Name" : "Pu'ukohola Heiau National Historic Site", "pos" : [-155.81972 , 20.02667 ] } 418 | { "Name" : "Pukaskwa National Park", "pos" : [-85.9161 , 48.03361 ] } 419 | { "Name" : "Quttinirpaaq National Park", "pos" : [-68.4211 , 81.56388 ] } 420 | { "Name" : "Rainbow Bridge National Monument", "pos" : [-110.96382 , 37.07721 ] } 421 | { "Name" : "Red Hill Patrick Henry National Memorial", "pos" : [-78.89792 , 37.03222 ] } 422 | { "Name" : "Redwood National Park", "pos" : [-123.94482 , 41.4771 ] } 423 | { "Name" : "Richmond National Battlefield Park", "pos" : [-77.37345 , 37.42917 ] } 424 | { "Name" : "Riding Mountain National Park", "pos" : [-100.03572 , 50.86388 ] } 425 | { "Name" : "River Raisin National Battlefield Park", "pos" : [-83.37817 , 41.91361 ] } 426 | { "Name" : "Rock Creek and Potomac Parkway", "pos" : [-77.05439 , 38.91306 ] } 427 | { "Name" : "Rock Creek Park", "pos" : [-77.04498 , 38.9575 ] } 428 | { "Name" : "Rocky Mountain National Park", "pos" : [-105.68962 , 40.414 ] } 429 | { "Name" : "Roger Williams National Memorial", "pos" : [-71.41075 , 41.83038 ] } 430 | { "Name" : "Roosevelt Campobello International Park", "pos" : [-66.95915 , 44.87583 ] } 431 | { "Name" : "Rose Atoll Marine National Monument", "pos" : [-168.14994 , -14.50994 ] } 432 | { "Name" : "Ross Lake National Recreation Area", "pos" : [-121.24502 , 48.67306 ] } 433 | { "Name" : "Russell Cave National Monument", "pos" : [-85.80314 , 34.97417 ] } 434 | { "Name" : "Sagamore Hill National Historic Site", "pos" : [-73.49734 , 40.88556 ] } 435 | { "Name" : "Saguaro National Park", "pos" : [-111.13052 , 32.2432 ] } 436 | { "Name" : "Saint Croix Island International Historic Site", "pos" : [-67.13317 , 45.12833 ] } 437 | { "Name" : "Saint Croix National Scenic Riverway", "pos" : [-92.65735 , 45.38917 ] } 438 | { "Name" : "Saint Paul's Church National Historic Site", "pos" : [-73.82566 , 40.89278 ] } 439 | { "Name" : "Saint-Gaudens National Historic Site", "pos" : [-72.36848 , 43.4959 ] } 440 | { "Name" : "Salem Maritime National Historic Site", "pos" : [-70.88706 , 42.52056 ] } 441 | { "Name" : "Salinas Pueblo Missions National Monument", "pos" : [-106.09002 , 34.25972 ] } 442 | { "Name" : "Salt River Bay National Historical Park", "pos" : [-64.7587 , 17.77889 ] } 443 | { "Name" : "San Antonio Missions National Historical Park", "pos" : [-98.48008 , 29.36167 ] } 444 | { "Name" : "San Francisco Maritime National Historical Park", "pos" : [-122.42332 , 37.80639 ] } 445 | { "Name" : "San Juan Island National Historical Park", "pos" : [-122.98532 , 48.45583 ] } 446 | { "Name" : "San Juan National Historic Site", "pos" : [-66.11012 , 18.4675 ] } 447 | { "Name" : "Sand Creek Massacre National Historic Site", "pos" : [-102.52832 , 38.54083 ] } 448 | { "Name" : "Santa Monica Mountains National Recreation Area", "pos" : [-118.60222 , 34.10389 ] } 449 | { "Name" : "Santa Rosa and San Jacinto Mountains National Monument", "pos" : [-116.7055 , 33.80083 ] } 450 | { "Name" : "Saratoga National Historical Park", "pos" : [-73.63728 , 42.99889 ] } 451 | { "Name" : "Saugus Iron Works National Historic Site", "pos" : [-71.00873 , 42.46778 ] } 452 | { "Name" : "Scotts Bluff National Monument", "pos" : [-103.70052 , 41.83556 ] } 453 | { "Name" : "Sequoia National Park", "pos" : [-118.72242 , 36.36444 ] } 454 | { "Name" : "Sewall-Belmont House National Historic Site", "pos" : [-77.00344 , 38.89194 ] } 455 | { "Name" : "Shenandoah National Park", "pos" : [-78.30072 , 38.72 ] } 456 | { "Name" : "Shiloh National Cemetery", "pos" : [-88.32007 , 35.15041 ] } 457 | { "Name" : "Shiloh National Military Park", "pos" : [-88.32981 , 35.15188 ] } 458 | { "Name" : "Sirmilik National Park", "pos" : [-78.43416 , 72.34054 ] } 459 | { "Name" : "Sitka National Historical Park", "pos" : [-135.31362 , 57.04694 ] } 460 | { "Name" : "Sleeping Bear Dunes National Lakeshore", "pos" : [-86.02013 , 44.91306 ] } 461 | { "Name" : "Sonoran Desert National Monument", "pos" : [-112.45494 , 33.00167 ] } 462 | { "Name" : "Springfield Armory National Historic Site", "pos" : [-72.58151 , 42.10806 ] } 463 | { "Name" : "St. Lawrence Islands National Park", "pos" : [-75.87276 , 44.41444 ] } 464 | { "Name" : "Star-Spangled Banner National Historic Trail", "pos" : [-76.57995 , 39.26306 ] } 465 | { "Name" : "Statue Of Liberty National Monument", "pos" : [-74.04477 , 40.68968 ] } 466 | { "Name" : "Steamtown National Historic Site", "pos" : [-75.67116 , 41.40733 ] } 467 | { "Name" : "Stones River National Battlefield", "pos" : [-86.43639 , 35.87629 ] } 468 | { "Name" : "Stones River National Cemetery", "pos" : [-86.436 , 35.87639 ] } 469 | { "Name" : "Suitland Parkway", "pos" : [-76.96801 , 38.84694 ] } 470 | { "Name" : "Sunset Crater Volcano National Monument", "pos" : [-111.50042 , 35.36558 ] } 471 | { "Name" : "Tallgrass Prairie National Preserve", "pos" : [-96.55869 , 38.43278 ] } 472 | { "Name" : "Terra Nova National Park", "pos" : [-53.99583 , 48.51194 ] } 473 | { "Name" : "Thaddeus Kosciuszko National Memorial", "pos" : [-75.14732 , 39.94333 ] } 474 | { "Name" : "Theodore Roosevelt Birthplace National Historic Site", "pos" : [-73.98956 , 40.73889 ] } 475 | { "Name" : "Theodore Roosevelt Inaugural National Historic Site", "pos" : [-78.87226 , 42.90148 ] } 476 | { "Name" : "Theodore Roosevelt Island", "pos" : [-77.06402 , 38.89721 ] } 477 | { "Name" : "Theodore Roosevelt National Park", "pos" : [-103.24872 , 47.3352 ] } 478 | { "Name" : "Thomas Cole National Historic Site", "pos" : [-73.86178 , 42.22583 ] } 479 | { "Name" : "Thomas Edison National Historical Park", "pos" : [-74.23759 , 40.78694 ] } 480 | { "Name" : "Thomas Jefferson Memorial", "pos" : [-77.03647 , 38.88139 ] } 481 | { "Name" : "Thomas Stone National Historic Site", "pos" : [-77.03595 , 38.53139 ] } 482 | { "Name" : "Timpanogos Cave National Monument", "pos" : [-111.70912 , 40.44056 ] } 483 | { "Name" : "Tomb of the Unknowns", "pos" : [-77.07206 , 38.87638 ] } 484 | { "Name" : "Tonto National Monument", "pos" : [-111.09412 , 33.65694 ] } 485 | { "Name" : "Torngat Mountains National Park Reserve", "pos" : [-63.10027 , 58.67222 ] } 486 | { "Name" : "Touro Synagogue National Historic Site", "pos" : [-71.31178 , 41.48944 ] } 487 | { "Name" : "Tuktut Nogait National Park", "pos" : [-123.01622 , 69.28333 ] } 488 | { "Name" : "Tumaccori National Historical Park", "pos" : [-111.05052 , 31.5675 ] } 489 | { "Name" : "Tupelo National Battlefield", "pos" : [-88.73706 , 34.25528 ] } 490 | { "Name" : "Tuskegee Airmen National Historic Site", "pos" : [-85.67984 , 32.45722 ] } 491 | { "Name" : "Tuskegee Institute National Historic Site", "pos" : [-85.70762 , 32.43028 ] } 492 | { "Name" : "Tuzigoot National Monument", "pos" : [-112.02572 , 34.77085 ] } 493 | { "Name" : "U.S. Air Force Memorial", "pos" : [-77.06606 , 38.86865 ] } 494 | { "Name" : "Ukkusiksalik National Park", "pos" : [-87.30527 , 65.34166 ] } 495 | { "Name" : "Ulysses S. Grant National Historic Site", "pos" : [-90.35178 , 38.55111 ] } 496 | { "Name" : "United States Marine Corps War Memorial", "pos" : [-77.06946 , 38.89047 ] } 497 | { "Name" : "United States Navy Memorial", "pos" : [-77.02286 , 38.89417 ] } 498 | { "Name" : "Upper Missouri River Breaks National Monument", "pos" : [-109.02133 , 47.78333 ] } 499 | { "Name" : "USS Arizona Memorial", "pos" : [-157.94972 , 21.365 ] } 500 | { "Name" : "USS Utah Memorial", "pos" : [-157.96244 , 21.36889 ] } 501 | { "Name" : "Valley Forge National Historical Park", "pos" : [-75.43869 , 40.09693 ] } 502 | { "Name" : "Vanderbilt Mansion National Historic Site", "pos" : [-73.94174 , 41.79611 ] } 503 | { "Name" : "Vermilion Cliffs National Monument", "pos" : [-111.74105 , 36.80639 ] } 504 | { "Name" : "Vicksburg National Cemetery", "pos" : [-90.84959 , 32.34886 ] } 505 | { "Name" : "Vicksburg National Military Park", "pos" : [-90.84963 , 32.34879 ] } 506 | { "Name" : "Vietnam Veterans Memorial", "pos" : [-77.04756 , 38.8911 ] } 507 | { "Name" : "Vietnam Women's Memorial", "pos" : [-77.04679 , 38.8904 ] } 508 | { "Name" : "Virgin Islands Coral Reef National Monument", "pos" : [-64.72675 , 18.30611 ] } 509 | { "Name" : "Virgin Islands National Park", "pos" : [-64.73323 , 18.33333 ] } 510 | { "Name" : "Voyageurs National Park", "pos" : [-93.01663 , 48.0996 ] } 511 | { "Name" : "Vuntut National Park", "pos" : [-140.04712 , 68.30694 ] } 512 | { "Name" : "Walnut Canyon National Monument", "pos" : [-111.50942 , 35.17167 ] } 513 | { "Name" : "Wapusk National Park", "pos" : [-92.66999 , 57.24638 ] } 514 | { "Name" : "War in the Pacific National Historical Park", "pos" : [144.66694 , 13.3 ] } 515 | { "Name" : "Washington Monument", "pos" : [-77.03504 , 38.88947 ] } 516 | { "Name" : "Washita Battlefield National Historic Site", "pos" : [-99.70012 , 36.6175 ] } 517 | { "Name" : "Waterton Lakes National Park", "pos" : [-113.91482 , 49.04583 ] } 518 | { "Name" : "Weir Farm National Historic Site", "pos" : [-73.45455 , 41.25806 ] } 519 | { "Name" : "West Potomac Park", "pos" : [-77.0469 , 38.886 ] } 520 | { "Name" : "Whiskeytown-Shasta-Trinity National Recreation Area", "pos" : [-122.94172 , 40.73528 ] } 521 | { "Name" : "White House", "pos" : [-77.03634 , 38.89767 ] } 522 | { "Name" : "White Sands National Monument", "pos" : [-106.17142 , 32.77971 ] } 523 | { "Name" : "Whitman Mission National Historic Site", "pos" : [-118.46112 , 46.04 ] } 524 | { "Name" : "William Howard Taft National Historic Site", "pos" : [-84.50845 , 39.11972 ] } 525 | { "Name" : "William J Clinton Birthplace Home National Historic Site", "pos" : [-93.5964 , 33.66717 ] } 526 | { "Name" : "Wilson's Creek National Battlefield", "pos" : [-93.41984 , 37.11556 ] } 527 | { "Name" : "Wind Cave National Park", "pos" : [-103.43302 , 43.5909 ] } 528 | { "Name" : "Wolf Trap National Park for the Performing Arts", "pos" : [-77.26184 , 38.93694 ] } 529 | { "Name" : "Women's Rights National Historical Park", "pos" : [-76.8012 , 42.91083 ] } 530 | { "Name" : "Wood Buffalo National Park", "pos" : [-112.98592 , 59.39083 ] } 531 | { "Name" : "World War II Home Front National Historical Park", "pos" : [-122.36442 , 37.90619 ] } 532 | { "Name" : "Wrangell-St. Elias National Park", "pos" : [-143.21622 , 61.24284 ] } 533 | { "Name" : "Wrangell-St. Elias National Park and Preserve", "pos" : [-141.99972 , 61 ] } 534 | { "Name" : "Wright Brothers National Memorial", "pos" : [-75.66792 , 36.01417 ] } 535 | { "Name" : "Wupatki National Monument", "pos" : [-111.38662 , 35.56556 ] } 536 | { "Name" : "WW II Valor in the Pacific National Monument Atka Island", "pos" : [-174.44522 , 52.13806 ] } 537 | { "Name" : "WW II Valor in the Pacific National Monument Attu Island", "pos" : [172.90944 , 52.9025 ] } 538 | { "Name" : "WW II Valor in the Pacific National Monument Ford Island", "pos" : [-157.96022 , 21.36389 ] } 539 | { "Name" : "WW II Valor in the Pacific National Monument Kiska", "pos" : [177.46 , 51.96417 ] } 540 | { "Name" : "WW II Valor in the Pacific Tule Lake Relocation Center", "pos" : [-121.37466 , 41.88944 ] } 541 | { "Name" : "Yellowstone National Park", "pos" : [-110.61342 , 44.79573 ] } 542 | { "Name" : "Yoho National Park", "pos" : [-116.48622 , 51.39527 ] } 543 | { "Name" : "Yorktown National Cemetery", "pos" : [-76.50624 , 37.22493 ] } 544 | { "Name" : "Yosemite National Park", "pos" : [-119.69432 , 37.6379 ] } 545 | { "Name" : "Yucca House National Monument", "pos" : [-108.68612 , 37.25027 ] } 546 | { "Name" : "Yukon-Charley Rivers National Preserve", "pos" : [-142.79972 , 65 ] } 547 | { "Name" : "Zion National Park", "pos" : [-112.68142 , 37.22299 ] } 548 | 549 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Map of parks 5 | 6 | 9 | 10 | 11 | 30 | 31 | 32 | 33 |

National Park Locator

34 |
35 | 36 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | #!/bin/env node 2 | 3 | var express = require('express'); 4 | var fs = require('fs'); 5 | var mongodb = require('mongodb'); 6 | 7 | var App = function(){ 8 | 9 | // Scope 10 | var self = this; 11 | 12 | // Setup 13 | self.dbServer = new mongodb.Server(process.env.OPENSHIFT_MONGODB_DB_HOST,parseInt(process.env.OPENSHIFT_MONGODB_DB_PORT)); 14 | self.db = new mongodb.Db(process.env.OPENSHIFT_APP_NAME, self.dbServer, {auto_reconnect: true}); 15 | self.dbUser = process.env.OPENSHIFT_MONGODB_DB_USERNAME; 16 | self.dbPass = process.env.OPENSHIFT_MONGODB_DB_PASSWORD; 17 | 18 | self.ipaddr = process.env.OPENSHIFT_NODEJS_IP; 19 | self.port = parseInt(process.env.OPENSHIFT_NODEJS_PORT) || 8080; 20 | if (typeof self.ipaddr === "undefined") { 21 | console.warn('No OPENSHIFT_NODEJS_IP environment variable'); 22 | }; 23 | 24 | 25 | // Web app logic 26 | self.routes = {}; 27 | self.routes['health'] = function(req, res){ res.send('1'); }; 28 | 29 | //self.routes['root'] = function(req, res){res.send('You have come to the park apps web service. All the web services are at /ws/parks*. For example /ws/parks will return all the parks in the system in a JSON payload. Thanks for stopping by and have a nice day'); }; 30 | 31 | //returns all the parks in the collection 32 | self.routes['returnAllParks'] = function(req, res){ 33 | self.db.collection('parkpoints').find().toArray(function(err, names) { 34 | res.header("Content-Type:","application/json"); 35 | res.end(JSON.stringify(names)); 36 | }); 37 | }; 38 | 39 | //find a single park by passing in the objectID to the URL 40 | self.routes['returnAPark'] = function(req, res){ 41 | var BSON = mongodb.BSONPure; 42 | var parkObjectID = new BSON.ObjectID(req.params.id); 43 | self.db.collection('parkpoints').find({'_id':parkObjectID}).toArray(function(err, names){ 44 | res.header("Content-Type:","application/json"); 45 | res.end(JSON.stringify(names)); 46 | }); 47 | }; 48 | 49 | 50 | //find parks near a certain lat and lon passed in as query parameters (near?lat=45.5&lon=-82) 51 | self.routes['returnParkNear'] = function(req, res){ 52 | //in production you would do some sanity checks on these values before parsing and handle the error if they don't parse 53 | var lat = parseFloat(req.query.lat); 54 | var lon = parseFloat(req.query.lon); 55 | 56 | self.db.collection('parkpoints').find( {"pos" : {$near: [lon,lat]}}).toArray(function(err,names){ 57 | res.header("Content-Type:","application/json"); 58 | res.end(JSON.stringify(names)); 59 | }); 60 | }; 61 | 62 | 63 | self.routes['returnParkNameNear'] = function(req, res){ 64 | var lat = parseFloat(req.query.lat); 65 | var lon = parseFloat(req.query.lon); 66 | var name = req.params.name; 67 | self.db.collection('parkpoints').find( {"Name" : {$regex : name, $options : 'i'}, "pos" : { $near : [lon,lat]}}).toArray(function(err,names){ 68 | res.header("Content-Type:","application/json"); 69 | res.end(JSON.stringify(names)); 70 | }); 71 | }; 72 | 73 | self.routes['postAPark'] = function(req, res){ 74 | 75 | var name = req.body.name; 76 | var lat = req.body.lat; 77 | var lon = req.body.lon; 78 | console.log(req.body); 79 | 80 | self.db.collection('parkpoints').insert({'Name' : name, 'pos' : [lon,lat ]}), function(result){ 81 | //we should have caught errors here for a real app 82 | res.end('success'); 83 | }; 84 | }; 85 | 86 | self.routes['within'] = function(req, res){ 87 | var lat1 = parseFloat(req.query.lat1); 88 | var lon1 = parseFloat(req.query.lon1); 89 | var lat2 = parseFloat(req.query.lat2); 90 | var lon2 = parseFloat(req.query.lon2); 91 | 92 | self.db.collection('parkpoints').find({"pos" : { $geoWithin : { $box: [[lon2,lat2], [lon1,lat1]]}}}).toArray(function(err,names){ 93 | res.header("Content-Type:","application/json"); 94 | res.end(JSON.stringify(names)); 95 | }); 96 | }; 97 | 98 | 99 | 100 | 101 | // Web app urls 102 | 103 | self.app = express(); 104 | self.app.use(express.compress()); 105 | 106 | // Serve up content from public directory 107 | self.app.use(express.static(__dirname + '/public')); 108 | 109 | 110 | 111 | //This uses the Connect frameworks body parser to parse the body of the post request 112 | self.app.configure(function () { 113 | self.app.use(express.bodyParser()); 114 | self.app.use(express.methodOverride()); 115 | self.app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 116 | }); 117 | 118 | //define all the url mappings 119 | self.app.get('/health', self.routes['health']); 120 | //self.app.get('/', self.routes['root']); 121 | self.app.get('/ws/parks', self.routes['returnAllParks']); 122 | self.app.get('/ws/parks/park/:id', self.routes['returnAPark']); 123 | self.app.get('/ws/parks/near', self.routes['returnParkNear']); 124 | self.app.get('/ws/parks/name/near/:name', self.routes['returnParkNameNear']); 125 | self.app.get('/ws/parks/within', self.routes['within']); 126 | self.app.post('/ws/parks/park', self.routes['postAPark']); 127 | 128 | 129 | // Logic to open a database connection. We are going to call this outside of app so it is available to all our functions inside. 130 | 131 | self.connectDb = function(callback){ 132 | self.db.open(function(err, db){ 133 | if(err){ throw err }; 134 | self.db.authenticate(self.dbUser, self.dbPass, {authdb: "admin"}, function(err, res){ 135 | if(err){ throw err }; 136 | callback(); 137 | }); 138 | }); 139 | }; 140 | 141 | 142 | //starting the nodejs server with express 143 | self.startServer = function(){ 144 | self.app.listen(self.port, self.ipaddr, function(){ 145 | console.log('%s: Node server started on %s:%d ...', Date(Date.now()), self.ipaddr, self.port); 146 | }); 147 | } 148 | 149 | // Destructors 150 | self.terminator = function(sig) { 151 | if (typeof sig === "string") { 152 | console.log('%s: Received %s - terminating Node server ...', Date(Date.now()), sig); 153 | process.exit(1); 154 | }; 155 | console.log('%s: Node server stopped.', Date(Date.now()) ); 156 | }; 157 | 158 | process.on('exit', function() { self.terminator(); }); 159 | 160 | self.terminatorSetup = function(element, index, array) { 161 | process.on(element, function() { self.terminator(element); }); 162 | }; 163 | 164 | ['SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGTRAP', 'SIGABRT', 'SIGBUS', 'SIGFPE', 'SIGUSR1', 'SIGSEGV', 'SIGUSR2', 'SIGPIPE', 'SIGTERM'].forEach(self.terminatorSetup); 165 | 166 | }; 167 | 168 | //make a new express app 169 | var app = new App(); 170 | 171 | //call the connectDb function and pass in the start server command 172 | app.connectDb(app.startServer); 173 | --------------------------------------------------------------------------------