gpt4 book ai didi

java - 如何在android中显示 map View 可见部分的定位销?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:04:32 25 4
gpt4 key购买 nike

这是我的 asynctask 部分,我将 pin 放在从 XML 解析的某个位置。这对于小型位置数据集来说效果很好,但是当位置数据集很大时需要很长时间。

private class MapLoader extends AsyncTask<Void, Void, Void> {
ProgressDialog dialog;
ArrayList<POI>[] mappoiList;

@Override
protected void onPreExecute() {
mapOverlays = mapview.getOverlays();
dialog = new ProgressDialog(MainActivity.this);
dialog.show();
}

@Override
protected Void doInBackground(Void... params) {

try {

URL url = new URL(MainActivity.baseUrl
+ "latitude=40.9192799&longitude=-74.0657508&distance=20");

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
ParserHandler parserHandler = new ParserHandler();
xr.setContentHandler(parserHandler);
xr.parse(new InputSource(url.openStream()));
Log.d("Thread", url.toString());
basicItems = parserHandler.getBasicItems();
featuredItems = parserHandler.getFeaturedItems();
restaurants = parserHandler.getRestaurants();
mapvisibleList = new ArrayList<POI>();
mappoiList = new ArrayList[2];
mappoiList[0] = new ArrayList<POI>();
mappoiList[1] = new ArrayList<POI>();

for (int i = 0; i < featuredItems.size(); i++) {

POI poi = new POI(featuredItems.get(i), 1);
mappoiList[0].add(poi);
}
for (int i = 0; i < restaurants.size(); i++) {

POI poi = new POI(restaurants.get(i), 2);
mappoiList[0].add(poi);
}
for (int i = 0; i < basicItems.size(); i++) {

POI poi = new POI(basicItems.get(i), 0);
mappoiList[1].add(poi);
}

for (int i = 0; i < mappoiList[0].size(); i++) {
if (mappoiList[0] != null) {
mapvisibleList.add(mappoiList[0].get(i));
}
}

for (int i = 0; i < mappoiList[1].size(); i++) {
if (mappoiList[1] != null) {
mapvisibleList.add(mappoiList[1].get(i));
}
}
for (FeaturedItem item : featuredItems) {
Log.d("FEATURED",
item.getName() + "Distance: " + item.getDistance());
}
for (Restaurant item : restaurants) {
Log.d("RESTAURANTS",
item.getName() + "Distance: " + item.getDistance());
}
for (BasicItem item : basicItems) {
Log.d("BASIC",
item.getName() + "Distance: " + item.getDistance());
}

} catch (MalformedURLException e) {
e.printStackTrace();
showErrorDialog("Error", "Malformed URL Error Occurred");
} catch (ParserConfigurationException e) {
e.printStackTrace();
showErrorDialog("Error",
"Parser Configuration Problem Occurred");
} catch (SAXException e) {
e.printStackTrace();
showErrorDialog("Error", "SAX Parser Error Occurred");
} catch (IOException e) {
e.printStackTrace();
showErrorDialog("Error", "IOException Occurred");
} catch (Exception e) {
e.printStackTrace();
}

GlobalData.gBasicItems = basicItems;
GlobalData.gFeaturedItems = featuredItems;
GlobalData.gRestaurants = restaurants;

if (currentLocation != null) {
int curLat = (int) (currentLocation.getLatitude() * 1e6);
int curLon = (int) (currentLocation.getLongitude() * 1e6);
GeoPoint gp = new GeoPoint(curLat, curLon);
mapControl.animateTo(gp);

mapControl.setZoom(14);
OverlayItem item = new OverlayItem(gp, "My Location",
"My Location");

itemizedOverlay1 = new MyItemizedOverlay(drawableFeature,
MainActivity.this, mappoiList[0]);
itemizedOverlay2 = new MyItemizedOverlay(drawableBasic,
MainActivity.this, mappoiList[1]);
itemizedOverlay3 = new MyItemizedOverlay(drawableCurrent,
MainActivity.this, mappoiList[0]);
Log.i("asyncbasic", "" + basicItems.size());
Log.i("asyncfeatured", "" + featuredItems.size());
Log.i("asyncres", "" + restaurants.size());
if (featuredItems != null) {
int featuredLength = featuredItems.size();
for (int i = 0; i < featuredLength; i++) {
FeaturedItem fItem = featuredItems.get(i);
int lat = (int) (Double
.parseDouble(fItem.getLatitude()) * 1e6);
int lon = (int) (Double.parseDouble(fItem
.getLongitude()) * 1e6);
OverlayItem oItem = new OverlayItem(new GeoPoint(lat,
lon), fItem.getName(), "Feature");
itemizedOverlay1.addOverlay(oItem);
Log.i("Map over lay", "Finished one featured");
}
}
if (basicItems != null) {
int basicLength = basicItems.size();
for (int i = 0; i < basicLength; i++) {
BasicItem bItem = basicItems.get(i);
int lat = (int) (Double
.parseDouble(bItem.getLatitude()) * 1e6);
int lon = (int) (Double.parseDouble(bItem
.getLongitude()) * 1e6);
OverlayItem oItem = new OverlayItem(new GeoPoint(lat,
lon), bItem.getName(), "Basic");
itemizedOverlay2.addOverlay(oItem);
Log.i("Map over lay", "Finished one Basic");

}
}
if (restaurants != null) {
int resLength = restaurants.size();
for (int i = 0; i < resLength; i++) {
Restaurant res = restaurants.get(i);
int lat = (int) (Double.parseDouble(res.getLatitude()) * 1e6);
int lon = (int) (Double.parseDouble(res.getLongitude()) * 1e6);
OverlayItem oItem = new OverlayItem(new GeoPoint(lat,
lon), res.getName(), "Restaurant");
itemizedOverlay1.addOverlay(oItem);
Log.i("Map over lay", "Finished one Restaurant");
}
}

itemizedOverlay3.addOverlay(item);
}

return null;
}

@Override
protected void onPostExecute(Void result) {
mapOverlays.clear();
mapOverlays.add(itemizedOverlay1);
mapOverlays.add(itemizedOverlay2);
mapOverlays.add(itemizedOverlay3);
mapview.postInvalidate();
dialog.dismiss();

}
}

我了解了如何使用 getLatitudeSpangetLongitudeSpan 来解决这个问题,但我不太清楚在我的异步任务中在哪里以及如何使用它。有什么建议吗?

最佳答案

请给出所用时间较长的确切数据大小,同时尝试分析代码以查看每个代码块所用的时间。

但是看看代码,如果操作的数据增加,遍历所有这些变量会对时间产生重大影响,

尝试简化/组合循环,

例如这个循环

        for (int i = 0; i < featuredItems.size(); i++) {

POI poi = new POI(featuredItems.get(i), 1);
mappoiList[0].add(poi);
}

还有这个

       if (featuredItems != null) {
int featuredLength = featuredItems.size();
for (int i = 0; i < featuredLength; i++) {
FeaturedItem fItem = featuredItems.get(i);
int lat = (int) (Double
.parseDouble(fItem.getLatitude()) * 1e6);
int lon = (int) (Double.parseDouble(fItem
.getLongitude()) * 1e6);
OverlayItem oItem = new OverlayItem(new GeoPoint(lat,
lon), fItem.getName(), "Feature");
itemizedOverlay1.addOverlay(oItem);
Log.i("Map over lay", "Finished one featured");
}
}

不能合并吗?

也是这个循环

   for (int i = 0; i < basicItems.size(); i++) {

POI poi = new POI(basicItems.get(i), 0);
mappoiList[1].add(poi);
}

还有这个

        if (basicItems != null) {
int basicLength = basicItems.size();
for (int i = 0; i < basicLength; i++) {
BasicItem bItem = basicItems.get(i);
int lat = (int) (Double
.parseDouble(bItem.getLatitude()) * 1e6);
int lon = (int) (Double.parseDouble(bItem
.getLongitude()) * 1e6);
OverlayItem oItem = new OverlayItem(new GeoPoint(lat,
lon), bItem.getName(), "Basic");
itemizedOverlay2.addOverlay(oItem);
Log.i("Map over lay", "Finished one Basic");

}
}

也可以合并,

关于java - 如何在android中显示 map View 可见部分的定位销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14797964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com