顯示具有 lng 標籤的文章。 顯示所有文章
顯示具有 lng 標籤的文章。 顯示所有文章

2015年11月18日 星期三

ParseReact實作(五)--query出10個最近的點,顯示在map上面

其實在第二篇我們就寫過,找出十個最近的點,利用的是parse query的near(),可是問題來了!我們現在輸入一個點就會更新一個點,所以TodoItem(存輸入地址的table)跟Taipei(存所有診所的table)不能同時運作,因為我們要等輸入的更新過後才能query他去找最近的點,我們上一篇看到observe()只有一次,可是又只能在裡面query

我現在基本的想法是,將結果的10個點組成array傳入Map.js,在Map.js中把addMarker()放在迴圈中,如此就可在同一地圖上畫出很多點。

我嘗試將死的點餵給他,(每次都先從最笨的開始哈哈哈哈)


出現的結果,點擊還能有文字內容


目前我的問題是,我將讀進來的點存到parse的table,並同時利用這個點去query.near(),找到10個點之後我將它存成一個2D array。

第一:我要怎麼通知TodoList我的array已經產生好了?console.log上面顯示的順序看來,每次還沒產生完新的object,Map的lat、lng就已經被render了啊!!!

第二:如果這樣的方法不可行,我就必須在observe()裡面就產生query,那query裡面可以傳參數嗎?例如:

new Parse.Query('Taipei').near("location",new Parse.GeoPoint( lastItem.lat, lastItem.lng))

結果:

雖然結果是不行,但是我覺得是因為看不懂lastItem是什麼,畢竟他是一個query,如果可以把輸入的點keep住,這個方法或許可行。

第三:以程式順序來說,observe()的query是最先執行的,然後再透過render去呼叫其他需被傳入的參數,可是!!!!為什麼明明在後面被呼叫的 ParseReact.Mutation.Create可以trigger到query?因為輸出的query是有增加新object的,這表示其實query不用更新嗎?只要mutation到他就會自己被更新嗎?


結合以上第二第三,我們將點定義為global變數,然後在query中使用它


定義一個新的nearbyItems來使用near(),並且在render的時候多一個nearbyItems的map來傳最近的十個點給Map,現在的問題是:
Map不能分開,我原來的想法是在lastItem傳兩個參數進去,在nearbyItems再傳兩個進去,這樣一來中心點跟需要被加上去的十個點可以分開處理,可是結果好像不行,有這樣的訊息

於是我把兩個呼叫Map的四個參數全部補滿
雖然可以了可是這麼做會有很多問題:
第一:會傳五次lat lng給map,可是新的紀錄會一直洗掉前一個,變成只出現一張地圖卻有10張空白地圖的位置,因為實際上我們只要傳一次lat lng就好了啊幹嘛傳10次

第二:LastGeoPoint完全沒有更改到,前面一開始的宣告只是為了可以去query near的點,但是接下來在lastItem內做overwrite的時候就沒辦法了,global變數完全不為所動,以至於接下來沒辦法去用LastGeoPoint

第三:map不能拆開,一次就要給他全部需要接收的參數,不能這邊給兩個下一次再給另外兩個,問題是就是要不同的query才能給

我真的是快被卡死了.................



2015年11月17日 星期二

ParseReact實作(四)--輸入地址就更新地圖

在上一篇我們指定死的座標給地圖成功之後,現在我們要動態去更改它的座標位置,當然第一步我們要先把Map.js中的程式碼全部都變成繼承TodoList.js傳入的參數,將原來的數字部分都改成this.prop.參數名稱。



再從TodoList.js去處理傳入的參數。
首先,第一個問題就是,我們是要從parse的table中取出資料,而不是在輸入的時候讀入資料,TodoList.js的結構是先query再render顯示
那observe()是哪裡來的?又是做什麼?
我們來看到ParseReact的document

https://github.com/ParsePlatform/ParseReact/tree/master/docs/api

在當中我們可以看到有細分許多,例如ParseReact.Mixin 還有 ParseReact.Mutation等等,看過之後我在Mixin中發現了observe(),意思就是說ParseReact中有一個Mixin的class中有一個observe function,追溯下去他的功能,我們在library中的Mixin.js中定義出observe()是一個query的必要function,傳入的參數是props跟state,也就是query起初的定義function,你要是不定義會有error message

'Components using ParseReact.Mixin must declare an observe() method.'

前提是!!!!這是export default class TodoList extends ParseComponent 才能用的喔,如果是一般的React .createclass是沒有這個function可以使用的。

在上面的程式碼可以看到我們將TodoItem這個加入條件後的query指給items,然後在render的地方使用this.data.items.map(function(i) show出所有的items,可是我只有一個地圖啊,我只能傳一次參數給map不然會show出超多map,要怎麼樣讓query只傳一個object給items呢?

沒錯!!!!利用parse的limit(數量),在這之前我們也試過用first(),可是first是一個需要回傳的function,我們其實只需要一個條件就夠了,沒辦法在裡面再加一個function,於是我們就在observe裡面放了兩個query~~~~一個給List show出來用,一個給Map的參數用。



然後在render的地方傳給他們


其實到這裡我還是有兩個問題:
第一:傳給map()的是object(也就是i),為什麼只要傳給他object就可以自動找出誰是lat誰是lng呢?
object log出來長這樣

第二:observe()是建立了query沒有錯,可是在哪裡執行?沒有query.find()也沒有query.first(),到底怎麼執行的?

但是還是成功了~~~~

耶嘿~~~~~~~~
請專業的大家幫我想一想到底答案是啥,我會萬分億分感謝您!!!!

2015年10月11日 星期日

ParseReact實作(二)--轉換經緯度並存在table,找出最近的十個點

現在要來利用demo做點更改,我想做一個可以輸入地址後,自動找出最靠近的十個醫院,並且顯示在google map上,首先我要先把地址轉換成經緯度,我參考了這個網站http://tutorialzine.com/2015/04/first-webapp-react/

在裡面轉換成經緯度的是用
include



進來之後,定義geocoder,我想在提交的時候觸發轉換經緯度,所以我將submit觸發的_createItem  function中加入geocoder




很好,那我要怎麼debug,console log人呢????

在chrome裡面都有一個開發人員工具,可以在檢視裡面找到



打開之後就利用console的地方來debug



程式碼的部分就是在TodoList.react.js中觸發submit的部分加入


其中text就是input的部分,也就是輸入的地址。
接下來利用



看看console log

成功!!!!!

可是我想把座標轉成geopoint存到我的parse上面。
首先我先嘗試將轉換的latlng直接存到我的parse,結果他呈現的狀態是object


{"J":25.0381495,"M":121.56429379999997}

這不是我的geopoint...........
於是我加上了

並且把這個point利用mutation function放到parse上面,

成功地把location轉成geopoint放入table中了!!!

再來我利用了parse的function--near來處理這些資料
我所有醫院的資料都在Taipei這個table裡面,所以利用query去找那些點

 出來的console log

成功!