{"id":184901,"date":"2013-07-31T22:13:34","date_gmt":"2013-08-01T05:13:34","guid":{"rendered":"http:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=184901"},"modified":"2018-12-18T10:48:01","modified_gmt":"2018-12-18T18:48:01","slug":"new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet","title":{"rendered":"New Esri Open Source Javascript Projects: Esri-Leaflet, Geoservices.js, Terraformer, Pushlet"},"author":5821,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[37101,22941],"tags":[24921,31501],"industry":[],"product":[36601],"class_list":["post-184901","blog","type-blog","status-publish","format-standard","hentry","category-announcements","category-mapping","tag-javascript","tag-open-source","product-developers"],"acf":{"short_description":"We are happy to announce four open source Javascript projects we\u2019ve been working on in the last few months!","flexible_content":[{"acf_fc_layout":"content","content":"<p>We are happy to announce four open source Javascript projects we\u2019ve been working on in the last few months!<\/p>\n<ul>\n<li><a href=\"https:\/\/blogs.esri.com\/esri\/arcgis\/2013\/07\/31\/new-esri-open-source-javascript-projects-leaflet-geoservices-js-terraformer-pushlet\/#esri-leaflet\">Esri-Leaflet<\/a>\u00a0is a Javascript library to help developers build lightweight applications using the Leaflet Javascript mapping library.<\/li>\n<li><a href=\"https:\/\/blogs.esri.com\/esri\/arcgis\/2013\/07\/31\/new-esri-open-source-javascript-projects-leaflet-geoservices-js-terraformer-pushlet\/#geoservices-js\">Geoservices.js<\/a>\u00a0is a Javascript client for accessing ArcGIS Online services from the browser or Node.js.<\/li>\n<li><a href=\"https:\/\/blogs.esri.com\/esri\/arcgis\/2013\/07\/31\/new-esri-open-source-javascript-projects-leaflet-geoservices-js-terraformer-pushlet\/#terraformer\">Terraformer<\/a>\u00a0is a geometry toolkit for working with different geometry formats and building geo databases.<\/li>\n<li><a href=\"https:\/\/blogs.esri.com\/esri\/arcgis\/2013\/07\/31\/new-esri-open-source-javascript-projects-leaflet-geoservices-js-terraformer-pushlet\/#pushlet\">Pushlet<\/a>\u00a0is a simple API for sending notifications through the Apple and Google push notification services.<\/li>\n<\/ul>\n<h2 id=\"esri-leaflet\">Esri-Leaflet<\/h2>\n<p><strong><a href=\"https:\/\/github.com\/Esri\/esri-leaflet\">Esri-Leaflet<\/a>\u00a0is a Javascript library to help developers build lightweight applications using the Leaflet Javascript mapping library.<\/strong>\u00a0It works well with\u00a0<a href=\"https:\/\/blogs.esri.com\/esri\/arcgis\/2013\/07\/31\/new-esri-open-source-javascript-projects-leaflet-geoservices-js-terraformer-pushlet\/#terraformer\">Terraformer<\/a>\u00a0for converting data between different geo formats, and\u00a0<a href=\"https:\/\/github.com\/esri\/geoservices-js\">geoservices-js<\/a>\u00a0for making advanced requests to ArcGIS REST services such as place finding and reverse geocoding. If you\u2019re familiar with Leaflet, you\u2019ll feel right at home using this library. All of the Leaflet conventions are followed, so you can use ArcGIS services in a familiar style. One of the major benefits of using Esri-Leaflet over accessing the ArcGIS map tiles directly is this library handles displaying the correct attributions depending on the visible map area. Esri-Leaflet also has support for displaying\u00a0<strong>retina basemaps<\/strong>!<\/p>\n<h3 id=\"demographic-data-service\">Demographic Data Service<\/h3>\n<p>Below is an example of displaying a tiled ArcGIS map service over the gray basemap in an Esri Leaflet map.\u00a0<a href=\"http:\/\/esri.github.io\/esri-leaflet\/examples\/\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"http:\/\/aaronparecki.com\/articles\/2013\/07\/12\/1\/files\/esri-leaflet-demographic-maps-portland.jpg\" alt=\"\" width=\"722\" height=\"592\" \/><\/a><br \/>\nIt\u2019s as simple as this code snippet!<\/p>\n<pre>var baseUrl = \"http:\/\/services.arcgisonline.com\/ArcGIS\/rest\/services\/Demographics\/\r\nUSA_Tapestry\/MapServer\";\r\n\r\ntiledLayer = L.esri.tiledMapLayer(url, {\r\n                opacity: 0.25,\r\n                zIndex:2,\r\n                detectRetina: true\r\n              }).addTo(map);<\/pre>\n<h3 id=\"bike-routes\">Bike Routes<\/h3>\n<p>Of course we\u2019re not limited to displaying just points or polygons, lines work too! Here is a map showing bike routes in Portland.\u00a0<a href=\"http:\/\/esri.github.io\/esri-leaflet\/examples\/\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/aaronparecki.com\/articles\/2013\/07\/12\/1\/files\/esri-leaflet-symbolize-line-features-bike-routes-portland.jpg\" alt=\"Bike Routes\" width=\"879\" height=\"798\" \/><\/a><\/p>\n<pre>L.esri.featureLayer(\"http:\/\/services.arcgis.com\/uCXeTVveQzP4IIcx\/arcgis\/rest\/services\/\r\nbike_rte\/FeatureServer\/0\", {\r\n  style: function (feature) {\r\n    return getStyle(feature);\r\n  },\r\n  onEachFeature: function(geojson, layer){\r\n    layer.bindPopup(\"&lt;h3&gt;\"+geojson.properties.BIKEMODE+\"&lt;\/h3&gt;&lt;p&gt;\r\n\" +(geojson.properties.PREFIX ? geojson.properties.PREFIX : \"\")+\r\n\" \" +(geojson.properties.STREETNAME ? geojson.properties.STREETNAME : \"\")+\r\n\" \" +(geojson.properties.FTTYPE ? geojson.properties.FTTYPE : \"\")+\" \"); } }).addTo(map);<\/pre>\n<h3 id=\"more-demos\">More Demos<\/h3>\n<p>Check out\u00a0<a href=\"http:\/\/esri.github.io\/esri-leaflet\/demo\/\">more demos<\/a>\u00a0on the Esri-Leaflet Github page!<\/p>\n<h2 id=\"geoservices-js\">Geoservices.js<\/h2>\n<p><strong><a href=\"https:\/\/github.com\/Esri\/geoservices-js\">Geoservices.js<\/a>\u00a0is a Javascript client that allows you to retrieve data and make queries against ArcGIS Online and to other services that adhere to the\u00a0<a href=\"http:\/\/www.esri.com\/library\/whitepapers\/pdfs\/geoservices-rest-spec.pdf\">Geoservices specification<\/a>.<\/strong>\u00a0It works both in the browser:<\/p>\n<pre>&lt;script src=\"browser\/geoservices.js\"&gt;&lt;\/script&gt;\r\n&lt;script&gt; var client = new Geoservices(); &lt;\/script&gt;<\/pre>\n<p>and from Node.js!<\/p>\n<pre>var Geoservices = require('geoservices'); \r\nvar client = new Geoservices();<\/pre>\n<p>Currently it can be used to consuming free services, and you can also use it to authenticate and consume paid services. For now, it supports\u00a0<a href=\"http:\/\/geocode.arcgis.com\/\">geocoding<\/a>\u00a0and\u00a0<a href=\"http:\/\/resources.arcgis.com\/en\/help\/arcgisonline\/010q\/010q00000082000000.htm\">feature services<\/a>, and will soon support the\u00a0<a href=\"http:\/\/route.arcgis.com\/\">directions and routing services<\/a>\u00a0and eventually the geometry service. Here is sample code for using the simple geocoder service:<\/p>\n<pre>client.geocode({ text: \"920 SW 3rd Ave, Portland, OR 97204\" }, function (err, result) {\r\n  if (err) {\r\n    console.error(\"ERROR: \" + err);\r\n  } else {\r\n    console.log(\"Found it at \" + result.locations[0].feature.geometry.y + \", \r\n\" result.locations[0].feature.geometry.x);\r\n  }\r\n});<\/pre>\n<h2 id=\"terraformer\">Terraformer<\/h2>\n<p><strong><a href=\"https:\/\/github.com\/esri\/terraformer\">Terraformer<\/a>\u00a0is a geometry toolkit for working with different geometry formats and building geo databases.<\/strong>Terraformer is a lightweight Javascript library that can be used both from the browser and from Node.js. You can use Terraformer to<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/Esri\/Terraformer\/tree\/master\/examples\/geojson-viewer\">View GeoJSON on an ArcGIS map<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Esri\/Terraformer\/tree\/master\/examples\/wkt-viewer\">Visualize Well-Known-Text with an R-Tree index<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Esri\/Terraformer\/tree\/master\/examples\/counties\">Visualize and search US County data using Terraformer\u2019s GeoStore<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Esri\/Terraformer\/tree\/master\/examples\/timezone\">Create a simple timezone API with Terraformer and Node.js<\/a><\/li>\n<\/ul>\n<p>For example, Terraformer can load in a file of all the US counties, build an R-Tree index, and can then quickly query which county a given latitude\/longitude is within.\u00a0<a href=\"https:\/\/github.com\/Esri\/Terraformer\/tree\/master\/examples\/counties\"><img decoding=\"async\" src=\"http:\/\/aaronparecki.com\/articles\/2013\/07\/12\/1\/files\/terraformer-us-counties.jpg\" alt=\"US Counties in Terraformer\" \/><\/a><\/p>\n<h2 id=\"pushlet\">Pushlet<\/h2>\n<p><strong><a href=\"https:\/\/github.com\/esri\/pushlet\">Pushlet<\/a>\u00a0is a simple API for sending notifications through the Apple and Google push notification services.<\/strong>If you\u2019ve ever had the pleasure of working directly with the Apple APNS API, you know how difficult it can be to get it right. To connect to APNS, you have to configure SSL certificates to authenticate, and then it requires maintaining a persistent socket connection to the servers rather than making a new connection for each push notification. Pushlet is a stateless wrapper around the API designed to make it easier to use, like you\u2019d use a typical HTTP API. Pushlet uses Redis as a temporary data store to store certificates, and maintains the socket connections to the APNS service so you don\u2019t have to worry about it. Using Pushlet to send a notification is as simple as making a POST request to the Pushlet endpoint like the following:<\/p>\n<pre>{\r\n  \"appId\": \"com.example.iphone\",\r\n  \"deviceId\": \"809f1d3237cd219c1c672bb141f6e18513fd86a073479ef295fd0e1687270853\",\r\n  \"mode\": \"production\",\r\n  \"notification\": {\r\n    alert: \"The quick brown fox jumps over the lazy dog\"\r\n  }\r\n}<\/pre>\n<p>If Pushlet doesn\u2019t yet have the certificate for this appId, it will respond with this message:<\/p>\n<pre>{\r\n  \"response\":\"error\",\r\n  \"error\":\"missing certificate\"\r\n}<\/pre>\n<p>Then you just re-send the message including the push certificate.<\/p>\n<pre>{\r\n  \"appId\": \"com.example.iphone\",\r\n  \"deviceId\": \"809f1d3237cd219c1c672bb141f6e18513fd86a073479ef295fd0e1687270853\",\r\n  \"mode\": \"production\",\r\n  \"notification\": {\r\n    \"alert\": \"The quick brown fox jumps over the lazy dog\"\r\n  },\r\n  \"cert\":\"-----BEGIN CERTIFICATE-----\\nMIIFV...\",\r\n  \"key\":\"-----BEGIN PRIVATE KEY-----\\nMIIEvQI...\"\r\n}<\/pre>\n<p>after Pushlet successfully connects to APNS and delivers the message, it will wait for a specified time to see if the socket is closed (Apple\u2019s way of indicating an error condition) and if the socket remains open, responds with \u201cok\u201d.<\/p>\n<pre>{\r\n  \"response\": \"ok\"\r\n}<\/pre>\n<p>Of course once you\u2019re certain your certificates are configured properly and have successfully sent push notifications to your devices, you can disable the timeout and speed up the HTTP response.<\/p>\n<pre>{\r\n  \"appId\": \"com.example.iphone\",\r\n  \"deviceId\": \"809f1d3237cd219c1c672bb141f6e18513fd86a073479ef295fd0e1687270853\",\r\n  \"mode\": \"production\",\r\n  \"notification\": {\r\n    alert: \"The quick brown fox jumps over the lazy dog\"\r\n  },\r\n  \"timeout\": 0\r\n}\r\n\r\n{\r\n  \"response\": \"sent\"\r\n}<\/pre>\n<p>Since Pushlet does not store device tokens, and is not the primary store of push certificates, you can easily run multiple instances of Pushlet on a cluster of machines to increase throughput.<\/p>\n"}],"authors":[{"ID":5821,"user_firstname":"Aaron","user_lastname":"Parecki","nickname":"aaronpk","user_nicename":"aaronpk","display_name":"Aaron Parecki","user_email":"aparecki@esri.com","user_url":"","user_registered":"2018-03-02 00:17:38","user_description":"","user_avatar":"<img alt='' src='https:\/\/secure.gravatar.com\/avatar\/386e9d70573ca30e657daf1a4b993bba49df3434b3b9abe7b7a1dffed0473da3?s=96&#038;d=blank&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/386e9d70573ca30e657daf1a4b993bba49df3434b3b9abe7b7a1dffed0473da3?s=192&#038;d=blank&#038;r=g 2x' class='avatar avatar-96 photo' height='96' width='96' loading='lazy' decoding='async'\/>"}],"related_articles":"","card_image":false,"wide_image":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>New Esri Open Source Javascript Projects: Esri-Leaflet, Geoservices.js, Terraformer, Pushlet<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"New Esri Open Source Javascript Projects: Esri-Leaflet, Geoservices.js, Terraformer, Pushlet\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"article:modified_time\" content=\"2018-12-18T18:48:01+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet\"},\"author\":{\"name\":\"Aaron Parecki\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/8afd723e695283eac51f608991dcbc51\"},\"headline\":\"New Esri Open Source Javascript Projects: Esri-Leaflet, Geoservices.js, Terraformer, Pushlet\",\"datePublished\":\"2013-08-01T05:13:34+00:00\",\"dateModified\":\"2018-12-18T18:48:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet\"},\"wordCount\":11,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"JavaScript\",\"open source\"],\"articleSection\":[\"Announcements\",\"Mapping\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet\",\"name\":\"New Esri Open Source Javascript Projects: Esri-Leaflet, Geoservices.js, Terraformer, Pushlet\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2013-08-01T05:13:34+00:00\",\"dateModified\":\"2018-12-18T18:48:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"New Esri Open Source Javascript Projects: Esri-Leaflet, Geoservices.js, Terraformer, Pushlet\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/8afd723e695283eac51f608991dcbc51\",\"name\":\"Aaron Parecki\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/386e9d70573ca30e657daf1a4b993bba49df3434b3b9abe7b7a1dffed0473da3?s=96&d=blank&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/386e9d70573ca30e657daf1a4b993bba49df3434b3b9abe7b7a1dffed0473da3?s=96&d=blank&r=g\",\"caption\":\"Aaron Parecki\"},\"url\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"New Esri Open Source Javascript Projects: Esri-Leaflet, Geoservices.js, Terraformer, Pushlet","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet","og_locale":"en_US","og_type":"article","og_title":"New Esri Open Source Javascript Projects: Esri-Leaflet, Geoservices.js, Terraformer, Pushlet","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2018-12-18T18:48:01+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet"},"author":{"name":"Aaron Parecki","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/8afd723e695283eac51f608991dcbc51"},"headline":"New Esri Open Source Javascript Projects: Esri-Leaflet, Geoservices.js, Terraformer, Pushlet","datePublished":"2013-08-01T05:13:34+00:00","dateModified":"2018-12-18T18:48:01+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet"},"wordCount":11,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["JavaScript","open source"],"articleSection":["Announcements","Mapping"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet","name":"New Esri Open Source Javascript Projects: Esri-Leaflet, Geoservices.js, Terraformer, Pushlet","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2013-08-01T05:13:34+00:00","dateModified":"2018-12-18T18:48:01+00:00","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/new-esri-open-source-javascript-projects-esri-leaflet-geoservices-js-terraformer-pushlet#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"New Esri Open Source Javascript Projects: Esri-Leaflet, Geoservices.js, Terraformer, Pushlet"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/8afd723e695283eac51f608991dcbc51","name":"Aaron Parecki","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/386e9d70573ca30e657daf1a4b993bba49df3434b3b9abe7b7a1dffed0473da3?s=96&d=blank&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/386e9d70573ca30e657daf1a4b993bba49df3434b3b9abe7b7a1dffed0473da3?s=96&d=blank&r=g","caption":"Aaron Parecki"},"url":""}]}},"text_date":"July 31, 2013","author_name":"Aaron Parecki","author_page":false,"custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/Newsroom-Keyart-Wide-1920-x-1080.jpg","primary_product":"Developers","tag_data":[{"term_id":24921,"name":"JavaScript","slug":"javascript","term_group":0,"term_taxonomy_id":24921,"taxonomy":"post_tag","description":"","parent":0,"count":151,"filter":"raw"},{"term_id":31501,"name":"open source","slug":"open-source","term_group":0,"term_taxonomy_id":31501,"taxonomy":"post_tag","description":"","parent":0,"count":15,"filter":"raw"}],"category_data":[{"term_id":37101,"name":"Announcements","slug":"announcements","term_group":0,"term_taxonomy_id":37101,"taxonomy":"category","description":"","parent":0,"count":1964,"filter":"raw"},{"term_id":22941,"name":"Mapping","slug":"mapping","term_group":0,"term_taxonomy_id":22941,"taxonomy":"category","description":"","parent":0,"count":2692,"filter":"raw"}],"product_data":[{"term_id":36601,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":36601,"taxonomy":"product","description":"","parent":0,"count":763,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=developers","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/184901","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/5821"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=184901"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/184901\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=184901"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=184901"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=184901"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=184901"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=184901"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}