» 首頁 » 討論區 » Android程式設計 »google map 地址 標記

google map 地址 標記

發表人: ooaaa
積分: 158
發表時間: 2011-09-20 12:14:46
請問大大...如何在地圖上 得到地址 變成標記..(從資料庫抓地址轉經緯度後,標在map上)

我最近在弄一個程式..我是用php + mysql 的 ..我想問

我拿到 mysql 的 地址後 如何變成座標?? 如果我的點有很多的話...變成座標後再按座標

點可以跳到另一頁嗎??請問大大們 有範例可供參考嗎??感恩
發表人: Seachaos
積分: 2432
發表時間: 2011-09-21 00:21:13
要在mapView上顯示標記可以用Overlay

以下是簡單Overlay的範例
[sea:javaCode]
public class MyPositionOverlay extends Overlay {
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Paint paint=new Paint();
paint.setColor(Color.BLACK)
canvas.drawText("TEST", 0, 0, paint);
super.draw(canvas, mapView, shadow);
}
}
[/sea]
發表人: ooaaa
積分: 158
發表時間: 2011-09-21 00:50:01
我的程式 大概是這個想法...就是 先定位 所在位置..
之後只要你按(例如)7仔便利店...就會列出 你這個所有位置 周圍的7仔便利店

又例如 你再按OK便利店 就會列出你這個位置周圍的 OK便利店...這些都會用地標來顯示

在地圖上...版大 請供程式參考..(會需要用到地址 轉成 地標...求例)
發表人: ting.316
積分: 2
發表時間: 2011-09-21 11:00:34
http://code.google.com/intl/zh-TW/apis/maps/articles/phpsqlsearch_v3.html

這個網址參考看看,或許對你有幫助:)
發表人: ooaaa
積分: 158
發表時間: 2011-09-21 14:16:05
那我想請教android 上的範例...應該怎樣運用到他們...
發表人: Seachaos
積分: 2432
發表時間: 2011-09-22 00:18:05
您好:
可以參考以下方法

[sea:javaCode]
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

MapView map = (MapView) findViewById(R.id.map);

Geocoder geo = new Geocoder(this);
MyOverlay myOverlay = new MyOverlay(getResources().getDrawable(R.drawable.icon));
try {
List<Overlay> overlays = map.getOverlays();
// 查詢地圖
List<Address> resp = geo.getFromLocationName("捷運", 100);
for(int ax=0;ax<resp.size();ax++){
Address address = resp.get(ax);
GeoPoint p = new GeoPoint((int)(address.getLatitude()*1E6), (int)(address.getLongitude()*1E6));
OverlayItem ovi = new OverlayItem(p, "Point", "TEST");
myOverlay.addOverley(ovi);
}
overlays.add(myOverlay);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

class MyOverlay extends ItemizedOverlay{
public int type;
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
public MyOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
}
@Override
public void draw(Canvas canvas, MapView mapView,boolean shadow){
super.draw(canvas, mapView, shadow);
}
@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}
@Override
public int size() {
return mOverlays.size();
}
public void addOverley(OverlayItem overley){
mOverlays.add(overley);
populate();
}
}
[/sea]
這是查出附近的捷運站 (可能結果不一定準)
然後顯示在Google Map上的範例
如果要更多的功能可以改寫Overlay
發表人: ooaaa
積分: 158
發表時間: 2011-09-22 03:20:52
版大...我用你的拿來跑...但跑不出地標...是甚麼問題呢??

[sea:javaCode]
GeoPoint p = new GeoPoint((int)(address.getLatitude()*1E6), (int)(address.getLongitude()*1E6));
[/sea]

這句就是地址 轉坐標嗎???

如果轉成 讀取MYSQL....用get['address'] 回傳到關鍵子上,應該可以做到吧??如果不行..應該要怎樣做??
發表人: Seachaos
積分: 2432
發表時間: 2011-09-22 17:59:03
對,這是把Address的經緯度轉成GeoPoint給Google mapView用

但你要注意你的數值
正常的經緯度要給GeoPoint要乘上1E6 (geoPoint用的是int,不是double)

你可以把地圖縮小看看,也許是地標在其他地方
發表人: ooaaa
積分: 158
發表時間: 2011-09-22 22:04:59
我用
[sea:javaCode]
controller.animateTo(p);
[/sea]
都是找不到地標....是甚麼問題呢??而且我在關鍵子上直接打上地址..也是找不到




如果轉成 讀取MYSQL....用get['address'] 回傳到關鍵子上,應該可以做到吧??
如果不行..應該要怎樣做??
發表人: Seachaos
積分: 2432
發表時間: 2011-09-22 23:47:26
不太懂你的意思
是說你要把MySQL的資料給Android嗎?
如果是的話可以參考上面ting.316大大的連結
裡面有詳細的用法
如果你覺得XML複雜的話可以改用JSON會比較簡單
發表人: ooaaa
積分: 158
發表時間: 2011-09-22 23:54:20
我直接用你的程式 來run... 直接在關鍵子上打上地址 run之後 都沒有標記在地圖上-.-...是甚麼問題呢??

我是想用mysql 的資料 給android 來標出地標..
發表人: Seachaos
積分: 2432
發表時間: 2011-09-23 01:05:33
有可能是地方離你太遠找不到
可以換看看比較簡單的keyword
不然就是直接打上座標(經緯度)
先確定你可以標記,再來看MySQL的問題

我這邊run起來是這樣的 (我人在臺北)
Image
PS. 這個測試我沒有伸請Map Key,所以看不到背景是正常的
發表人: ooaaa
積分: 158
發表時間: 2011-09-23 01:45:05
我看了文章...應該是跟模擬器有關係..應該要用版本7才可以抓得到..用版本8的話要用以下範例...版大..你知不知道怎樣 跟你 那個程式合在一齊用..我在苦惱中..我不太清楚要怎樣使用這個class..請大大教學一下


[sea:javaCode]
public class MapUtility {
public static JSONObject getLocationInfo(String address) {

HttpGet httpGet = new HttpGet("http://maps.google."

+ "com/maps/api/geocode/json?address=" + address

+ "&sensor=false");

HttpClient client = new DefaultHttpClient();

HttpResponse response;

StringBuilder stringBuilder = new StringBuilder();

try {

response = client.execute(httpGet);

HttpEntity entity = response.getEntity();

InputStream stream = entity.getContent();

int b;

while ((b = stream.read()) != -1) {

stringBuilder.append((char) b);

}

} catch (ClientProtocolException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

JSONObject jsonObject = new JSONObject();

try {

jsonObject = new JSONObject(stringBuilder.toString());

} catch (JSONException e) {

e.printStackTrace();

}

return jsonObject;

}

// converts JSONObject into a GeoPoint.

public static GeoPoint getGeoPoint(JSONObject jsonObject) {

Double lon = new Double(0);

Double lat = new Double(0);

try {

lon = ((JSONArray) jsonObject.get("results")).getJSONObject(0)

.getJSONObject("geometry").getJSONObject("location")

.getDouble("lng");

lat = ((JSONArray) jsonObject.get("results")).getJSONObject(0)

.getJSONObject("geometry").getJSONObject("location")

.getDouble("lat");

} catch (JSONException e) {

e.printStackTrace();

}

return new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6));

}

}
[/sea]
發表人: Seachaos
積分: 2432
發表時間: 2011-09-23 14:33:33
您好
你的Class已可以得到GeoPoint了

例如

[sea:javaCode]
geoPoint = getGeoPoint( getLocationInfo ("NTUST"));

try {
List<Overlay> overlays = map.getOverlays();
OverlayItem ovi = new OverlayItem(geoPoint, "Point", "TEST");
myOverlay.addOverley(ovi);
overlays.add(myOverlay);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

[/sea]

這樣就可把Overlays放到Google MapView上顯示 Map
發表人: ooaaa
積分: 158
發表時間: 2011-09-24 03:13:22
我已成功載入地標...但卡在另一個問題..就是我按7仔的按鈕...地圖會顯示7仔的地標...我按OK便利店的按鈕 會顯示OK便利店...但當我顯示OK便利店時 會出現錯誤..是否地圖地標有重覆的問題???

我是想 先刪除現有的地標...再更新 OK便利店的...這樣應該如何做???有些許範例參考嗎
發表人: Seachaos
積分: 2432
發表時間: 2011-09-24 17:23:34
如果你要清除Overlay的話有兩個方法
一個是全部清空
[sea:javaCode]
List<Overlay> overlays = mapView.getOverlays();
overlays.clear();
[/sea]

一個是刪除其中一個Overlay
[sea:javaCode]
List<Overlay> overlays = mapView.getOverlays();
overlays.remove(myOverlay);
[/sea]
發表人: ooaaa
積分: 158
發表時間: 2011-09-26 19:44:10
那如果我是要更新的用法呢..?? 我有上網找過就是refreshmap..但我試過也是會出錯...大大可以給我一些範例嗎..?? 我不太會debug-.-


我想問另一個問題..就是怎樣讀php 的function()..

比如我 a.php裡有一個function b() 這樣...之後我要在java裡面用到他
是不是要 "http://xxxx/xxx/xx/a.php?=action" = b(); 是這樣嗎???
發表人: Seachaos
積分: 2432
發表時間: 2011-09-26 23:39:23
更新mapView的Overlay的話和List的操作方式相當
要更新的話就要先移除掉舊的overlay

如果你要存取PHP的Function的話可以這樣寫

PHP程式碼:
[sea:phpCode]
function aFun(){ echo 'A'; }
function functionB(){ echo 'B'; }

switch($_GET['action']){
case 'aFun': aFun(); break;
case 'functionB': functionB(); break;
}
[/sea]

在呼叫的時候就是
http://xxx.xx/example.php?action=aFun
http://xxx.xx/example.php?action=functionB
發表人: ooaaa
積分: 158
發表時間: 2011-10-07 20:34:58
我想做一個gps 定位.....定位周圍 我所標在地圖上的點(可設範圍??)... 我應該如何下手??..

例如..我設了很多家 7仔... 但我就是只顯示我在位置(gps) 的附近幾家...

大大有沒有可參考的範例..
發表人: Seachaos
積分: 2432
發表時間: 2011-10-08 03:21:39
是可以限制範圍的
如下

[sea:javaCode]
double
lowerLeftLatitude = 24.974855,
lowerLeftLongitude = 121.447678,
upperRightLatitude = 25.082489,
upperRightLongitude = 121.559601;
List<Address> resp = geo.getFromLocationName("7-11", 100,
lowerLeftLatitude,
lowerLeftLongitude,
upperRightLatitude,
upperRightLongitude);
[/sea]