The error seems to be in the coordinates which the twitter json is spitting out. Depending what twitter is spitting back to me, the coords are either valid, or nan...or I assume they're valid. I might just try to do this over with epsg 900913 as the projection and see if I can side-step this horro alltogether...
On Tue, Jun 21, 2011 at 11:57 AM, Nicholas Efremov-Kendall < [email protected]> wrote: > Per a previous suggestion of Ian's the following seems to work and produces > valid coordinates for both lat and lon > > tweet.point = new > OpenLayers.LonLat(tweet.geo.coordinates[0],tweet.geo.coordinates[1]).transform(new > OpenLayers.Projection("EPSG:4326"),new > OpenLayers.Projection("EPSG:900913")); > > however, I still get the error at line 701 with "a.geometry.getBounds is > not a function" in firebug. Chrome doesn't produce an error, but doesn't add > the markers... > > > On Tue, Jun 21, 2011 at 11:37 AM, Nicholas Efremov-Kendall < > [email protected]> wrote: > >> Well, here's the kicker: >> >> tweet.point = new >> OpenLayers.LonLat(tweet.geo.coordinates[0],tweet.geo.coordinates[1]).transform(new >> OpenLayers.Projection("EPSG:900913"),map.getProjectionObject()); >> this returns two valid coordinates >> but with epsg 4326: the lat is corrupted to NAN. >> >> This cycles through the tweets correctly, but appears to break in OL at >> line 701 with the error a.geometry.getBounds is not a function...which I >> assume has to do with why the markers don't get added to the map... >> >> On Tue, Jun 21, 2011 at 11:10 AM, Nicholas Efremov-Kendall < >> [email protected]> wrote: >> >>> Hi Heath, >>> I believe I am calling the function on the LonLat pair with the below >>> code >>> >>> tweet.point = new >>> OpenLayers.LonLat(tweet.geo.coordinates[0],tweet.geo.coordinates[1]).transform(new >>> OpenLayers.Projection("EPSG:4326"),map.getProjectionObject()); >>> >>> which returns POINT(NaN Nan) when I call an alert in the below function. >>> If I don't call the transform function on the point, which works by the way >>> with placing the geolocated position which centers the map to get the 50km >>> radius for the tweets. >>> >>> I've tried your suggestion as well >>> >>> function parseTweetsQ(){ >>> if (tweetsQ.length > 0) { >>> var tweet = tweetsQ.pop(); >>> if (tweet.geo){ >>> var latlon = new >>> OpenLayers.LonLat(tweet.geo.coordinates[0],tweet.geo.coordinates[1]); >>> latlon.transform(new >>> OpenLayers.Projection("EPSG:4326"),map.getProjectionObject()); >>> tweet.point = latlon; >>> tweet.attributes = {}; >>> plotTwt(tweet); >>> }}} >>> >>> function plotTwt(tweet){ >>> twtpoint = new OpenLayers.Geometry.Point(tweet.point); >>> alert(twtpoint); >>> twtmark = new OpenLayers.Features.Vector(twtpoint); >>> tweetz.addFeatures([twtmark]); >>> } >>> >>> and I still get a POINT(Nan NaN) in the alert. I'm not sure what I'm >>> doing wrong here, but the syntax follows from other examples, and I know I'm >>> missing something really obvious here. If I call the alert in the parsetweet >>> function, it appears that the lon is converted, but the lat is corrupted to >>> a NaN... >>> >>> function plotTwt(tweet){ >>> twtpoint = new OpenLayers.Geometry.Point(tweet.point); >>> alert(twtpoint); >>> twtmark = new OpenLayers.Features.Vector(twtpoint); >>> tweetz.addFeatures([twtmark]); >>> alert(tweet.point); >>> } >>> >>> Full code is below >>> >>> var feat, OpenLayers, latlon; >>> var tweetz = new OpenLayers.Layer.Vector("Tweets", {styleMap: new >>> OpenLayers.StyleMap({externalGraphic: >>> "OpenLayers-2.11-rc1/img/marker-green.png", pointRadius: 10})}); >>> var marker = new OpenLayers.Layer.Vector("Marker", {styleMap: new >>> OpenLayers.StyleMap({externalGraphic: "OpenLayers-2.11-rc1/img/marker.png", >>> pointRadius: 10})}); >>> var map = new OpenLayers.Map('map'); >>> var tweets = []; >>> var tweetsQ = []; >>> var refreshQuery = '?='; >>> >>> function initGIS(){ >>> map.addControl(new OpenLayers.Control.LayerSwitcher()); >>> var mapnik = new OpenLayers.Layer.OSM(); >>> map.addLayer(mapnik); >>> map.addLayer(tweetz); >>> map.setCenter(new OpenLayers.LonLat(-90, 38).transform(new >>> OpenLayers.Projection("EPSG:4326"),map.getProjectionObject()),12); >>> $(document).everyTime('30s', acquireTweets); >>> $(document).everyTime('100ms', parseTweetsQ); >>> getLoc();} >>> >>> >>> function getLoc(){ >>> if (Modernizr.geolocation) { >>> navigator.geolocation.getCurrentPosition(plotLoc,handle_error); >>> } else { >>> yqlgeo.get('visitor',norm_yql_resp); >>> }} >>> >>> function createTWTsrcURL (){ >>> var temp = map.getCenter().transform(new >>> OpenLayers.Projection("EPSG:900913"),new >>> OpenLayers.Projection("EPSG:4326")); >>> return 'http://search.twitter.com/search.json' + refreshQuery + >>> '&geocode=' + temp.lat +'%2C' + temp.lon + '%2C50km&rpp=100&callback=?';} >>> >>> function plotLoc (position){ >>> map.addLayer(marker); >>> var feat = new OpenLayers.Feature.Vector(new >>> OpenLayers.Geometry.Point(position.coords.longitude,position.coords.latitude).transform(new >>> OpenLayers.Projection("EPSG:4326"),map.getProjectionObject())); >>> marker.addFeatures([feat]); >>> var bounds = marker.getDataExtent(); >>> map.zoomToExtent(bounds); >>> acquireTweets();} >>> >>> function acquireTweets(){ >>> $.getJSON(createTWTsrcURL(), function(data){ >>> if(data.results) >>> $.each(data.results, function(i, tweet){ >>> if (tweet.geo || tweet.location) >>> tweetsQ.push(tweet); >>> }); >>> refreshQuery = data.refresh_url; >>> });} >>> >>> function parseTweetsQ(){ >>> if (tweetsQ.length > 0) { >>> var tweet = tweetsQ.pop(); >>> if (tweet.geo){ >>> tweet.point = new >>> OpenLayers.LonLat(tweet.geo.coordinates[0],tweet.geo.coordinates[1]).transform(new >>> OpenLayers.Projection("EPSG:4326"),map.getProjectionObject()); >>> tweet.attributes = {}; >>> plotTwt(tweet); >>> }}} >>> >>> function createInfoContent(tweet) { >>> var retval = ''; >>> retval += '<div class="tweet_info">'; >>> retval += '<img alt="' + tweet.from_user_id + '" src="' + >>> tweet.profile_image_url + '" class="tweet_profile"/>'; >>> retval += '<h3>' + tweet.from_user + '</h3>'; >>> retval += '<p>' + tweet.text + '</p>'; >>> retval += '<p>Source: <a href="' + tweet.source + '"/>' + >>> tweet.source + '</a></p>'; >>> retval += '</div>'; >>> return retval;} >>> >>> function plotTwt(tweet){ >>> twtpoint = new OpenLayers.Geometry.Point(tweet.point); >>> alert(twtpoint); >>> twtmark = new OpenLayers.Features.Vector(twtpoint); >>> tweetz.addFeatures([twtmark]); >>> alert(tweet.point);} >>> >>> >>> function handle_error(error) { >>> switch(error.code){ >>> case error.PERMISSION_DENIED: alert("This application reguires you to >>> agree to share your location. Please reload the page to see it work >>> properly. There is a privacy disclaimer at the bottom of this page. This >>> site does not currently record or store these data, and in the future will >>> not record unique user information without informing the user or asking >>> their permission. -Virtual Spatiality"); >>> break; >>> case error.POSITION_UNAVAILABLE: alert("could not determine position"); >>> break; >>> case error.TIMEOUT: alert("timeout retrieving position"); >>> break; >>> default: alert("unknown error"); >>> break;}} >>> function norm_yql_resp(response){ >>> if (response.error) { >>> var error = {code : 0}; >>> handle_error(error); >>> return;}var position = {coords: >>> { latitude: response.place.centroid.latitude, >>> longitude: response.place.centroid.longitude >>> }, >>> address : >>> {city: response.place.locality2.content, >>> region: response.place.admin1.content, >>> country: response.place.country.content >>> }};handle_geolocation_query(position);} >>> On Tue, Jun 21, 2011 at 10:44 AM, B. Heath Robinson < >>> [email protected]> wrote: >>> >>>> I should have proofread the email BEFORE I sent it. >>>> >>>> Actually, it would be something like this: >>>> >>>> var latlon = new >>>> OpenLayers.LonLat(tweet.geo.coordinates[0],tweet.geo.coordinates[1]); >>>> latlon.transform(new >>>> OpenLayers.Projection("EPSG:4326"),map.getProjectionObject()); >>>> tweet.point = latlon; >>>> >>>> This assumes that tweet.geo.coordinates[0],tweet.geo.coordinates[1] is >>>> something that the LonLat constructor will take. >>>> >>>> On Jun 21, 2011, at 10:39 AM, B. Heath Robinson wrote: >>>> >>>> Transform operates on the coordinates, it does not return a new >>>> coordinates. You should use it like this: >>>> var latlon = weet.geo.coordinates[0],tweet.geo.coordinates[1]; >>>> latlon.transform(new >>>> OpenLayers.Projection("EPSG:4326"),map.getProjectionObject()); >>>> >>>> tweet.point = latlon; >>>> >>>> >>>> On Jun 21, 2011, at 10:21 AM, Nicholas Efremov-Kendall wrote: >>>> >>>> Hi guys thanks for the previous advice, >>>> >>>> I'm still running into an issue, and I'm not sure how to resolve it. >>>> When I first use a OpenLayers.LonLat and transform the point, I get the lon >>>> converted correctect, but the lat is returned NaN. If I don't transform it, >>>> the coordinates remain correct. >>>> >>>> tweet.point = new >>>> OpenLayers.LonLat(tweet.geo.coordinates[0],tweet.geo.coordinates[1]).transform(new >>>> OpenLayers.Projection("EPSG:4326"),map.getProjectionObject()); >>>> >>>> I've been playing around with some different iterations, and I can get >>>> tweet.point to alert out with ever tweet that's pulled into the plotting >>>> function, but the markers aren't added. The issue seems to be with how I'm >>>> calling the transform function, because somehow after calling the function >>>> I >>>> get NaN's for the lat-lon's inside the point object. I'm really hitting a >>>> wall here. >>>> >>>> >>>> >>>> On Tue, Jun 21, 2011 at 3:23 AM, Nick Kendall <[email protected]>wrote: >>>> >>>>> Thanks! Will take another crack at this Tom! >>>>> >>>>> Sent from my mobile device >>>>> >>>>> On Jun 21, 2011, at 2:37 AM, "Sveen Atle Frenvik (Geomatikk IKT)" < >>>>> [email protected]> wrote: >>>>> >>>>> try using an OpenLayers.Geometry.Point instead of an OpenLayers.LonLat >>>>> >>>>> ie (untested, but i think this is rather correct): >>>>> >>>>> function parseTweetsQ(){ >>>>> if (tweetsQ.length > 0) { >>>>> var tweet = tweetsQ.pop(); >>>>> if (tweet.geo){ >>>>> tweet.point = new >>>>> OpenLayers.Geometry.Point(tweet.geo.coordinates[0],tweet.geo.coordinates[1]).transform(new >>>>> OpenLayers.Projection("EPSG:4326"),map.getProjectionObject()); >>>>> tweet.attributes = {}; //in this you coukd stuff attributes >>>>> of the tweet for easy access on clicks etc. >>>>> plotTwt(tweet); >>>>> } >>>>> } >>>>> } >>>>> >>>>> function plotTwt(tweet){ >>>>> //why do you keep adding the layer for each tweet? >>>>> map.addLayer(tweetz); >>>>> tweet.marker = new >>>>> OpenLayers.Feature.Vector(tweet.point,{attributes:{tweet.attributes]}); >>>>> tweetz.addFeatures([tweet.marker]); >>>>> } >>>>> >>>>> >>>>> >>>>> On 2011-06-21 05:00, Nicholas Efremov-Kendall wrote: >>>>> >>>>> Hi Phil et al, >>>>> >>>>> Thanks for your response. The code as is does iterate through the >>>>> features as they are returned. I have a handle on it up to the plotting >>>>> function. An alert on the tweet.marker object returns [object Object], >>>>> while >>>>> tweet.latlng returns readable coordinates lon=38.6834,lat=-90.4313. I >>>>> guess >>>>> what I'm unsure about is how to parse the object which is passed to the >>>>> third function. Thanks again. >>>>> >>>>> >>>>> function acquireTweets(){ >>>>> $.getJSON(createTWTsrcURL(), function(data){ >>>>> if(data.results) >>>>> $.each(data.results, function(i, tweet){ >>>>> if (tweet.geo || tweet.location) >>>>> tweetsQ.push(tweet); >>>>> }); >>>>> refreshQuery = data.refresh_url; >>>>> });} >>>>> >>>>> function parseTweetsQ(){ >>>>> if (tweetsQ.length > 0) { >>>>> var tweet = tweetsQ.pop(); >>>>> if (tweet.geo){ >>>>> tweet.latlng = new >>>>> OpenLayers.LonLat(tweet.geo.coordinates[0],tweet.geo.coordinates[1]); >>>>> plotTwt(tweet); >>>>> }}} >>>>> >>>>> function plotTwt(tweet){ >>>>> map.addLayer(tweetz); >>>>> tweet.marker = new OpenLayers.Feature.Vector(new >>>>> OpenLayers.Geometry.Point(tweet.latlng).transform(new >>>>> OpenLayers.Projection("EPSG:4326"),map.getProjectionObject())); >>>>> tweetz.addFeatures([tweet.marker]);} >>>>> >>>>> >>>>> >>>>> >>>>> On Mon, Jun 20, 2011 at 9:13 PM, Phil Scadden < <[email protected]> >>>>> [email protected]> wrote: >>>>> >>>>>> I have no idea what the object returned by twitter is but surely, but >>>>>> if >>>>>> you are using jsonp, then >>>>>> have in your code something like: >>>>>> jsonp_function(json) >>>>>> where jsonp_function is the name of jsonp callback and json is the >>>>>> returned object. I would guess it contains an array of feature type >>>>>> objects, so you would iterate through the array, creating feature for >>>>>> each row, and calling vectorLayer.addFeatures(features) to add them to >>>>>> the vector layer. >>>>>> >>>>>> Notice: This email and any attachments are confidential. If received >>>>>> in error please destroy and immediately notify us. Do not copy or >>>>>> disclose >>>>>> the contents. >>>>>> >>>>>> _______________________________________________ >>>>>> Users mailing list >>>>>> <[email protected]>[email protected] >>>>>> <http://lists.osgeo.org/mailman/listinfo/openlayers-users> >>>>>> http://lists.osgeo.org/mailman/listinfo/openlayers-users >>>>>> >>>>> >>>>> >>>>> _______________________________________________ >>>>> Users mailing list <[email protected]>[email protected] >>>>> <http://lists.osgeo.org/mailman/listinfo/openlayers-users>http://lists.osgeo.org/mailman/listinfo/openlayers-users >>>>> >>>>> >>>>> >>>>> -- >>>>> Atle Frenvik Sveen >>>>> Utvikler >>>>> Geomatikk IKT AS >>>>> tlf: 45 27 86 89 >>>>> <[email protected]>[email protected] >>>>> >>>>> _______________________________________________ >>>>> Users mailing list >>>>> [email protected] >>>>> http://lists.osgeo.org/mailman/listinfo/openlayers-users >>>>> >>>>> >>>> _______________________________________________ >>>> Users mailing list >>>> [email protected] >>>> http://lists.osgeo.org/mailman/listinfo/openlayers-users >>>> >>>> >>>> _______________________________________________ >>>> Users mailing list >>>> [email protected] >>>> http://lists.osgeo.org/mailman/listinfo/openlayers-users >>>> >>>> >>>> >>> >> >
_______________________________________________ Users mailing list [email protected] http://lists.osgeo.org/mailman/listinfo/openlayers-users
