- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些形状文件,我已将其转换为 KML 文件,我希望从中读取坐标,然后在 MapView 上的坐标之间绘制路径。在这篇伟大的文章的帮助下:How to draw a path on a map using kml file?我已经能够将 KML 读入“地标”的 ArrayList。这篇很棒的博文随后展示了如何获取 GeoPoints 列表并绘制路径:http://djsolid.net/blog/android---draw-a-path-array-of-points-in-mapview
上面帖子中的示例只绘制了一些点之间的一条路径,但是由于我有比这更多的路径,所以我遇到了一些性能问题。我目前正在为每个单独的路径添加一个新的 RouteOverlay。这导致我有超过 800 个叠加层,当它们都被添加时。这会影响性能,我希望能就我可以做些什么来改进它提供一些意见。
以下是我考虑过的一些选项:
尝试将所有点添加到一个列表中,然后可以将该列表传递到将扩展覆盖的类中。在那个新类中,也许可以在单个覆盖层中添加和绘制路径?我不确定如何实现这一点,因为路径并不总是相交并且它们有不同的起点和终点。目前,我正在将具有多个点的每条路径添加到它自己的列表中,然后将其添加到叠加层中。这导致超过 700 个叠加层......
简化 KML 或 SHP。与其拥有超过 700 条不同的路径,也许有某种方法可以将它们合并为 100 条或更少的路径?由于很多路径在某个点相交,因此应该可以修改原始 SHP 文件,以便它合并所有交点。因为我之前从未使用过这些类型的文件,所以我无法在 GQIS 中找到执行此操作的方法。如果有人知道如何做到这一点,我很乐意为此提供一些意见。如果您有兴趣,这里是一组形状文件的链接:
http://danielkvist.net/cprg_bef_cbana_polyline.shp
http://danielkvist.net/cprg_bef_cbana_polyline.shx
http://danielkvist.net/cprg_bef_cbana_polyline.dbf
http://danielkvist.net/cprg_bef_cbana_polyline.prj
无论如何,这是我用来添加叠加层的代码。非常感谢。
RoutePathOverlay.java
package net.danielkvist;
import java.util.List;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.RectF;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;
public class RoutePathOverlay extends Overlay
{
private int _pathColor;
private final List<GeoPoint> _points;
private boolean _drawStartEnd;
public RoutePathOverlay(List<GeoPoint> points)
{
this(points, Color.RED, false);
}
public RoutePathOverlay(List<GeoPoint> points, int pathColor, boolean drawStartEnd)
{
_points = points;
_pathColor = pathColor;
_drawStartEnd = drawStartEnd;
}
private void drawOval(Canvas canvas, Paint paint, Point point)
{
Paint ovalPaint = new Paint(paint);
ovalPaint.setStyle(Paint.Style.FILL_AND_STROKE);
ovalPaint.setStrokeWidth(2);
int _radius = 6;
RectF oval = new RectF(point.x - _radius, point.y - _radius, point.x + _radius, point.y + _radius);
canvas.drawOval(oval, ovalPaint);
}
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
{
Projection projection = mapView.getProjection();
if (shadow == false && _points != null)
{
Point startPoint = null, endPoint = null;
Path path = new Path();
// We are creating the path
for (int i = 0; i < _points.size(); i++)
{
GeoPoint gPointA = _points.get(i);
Point pointA = new Point();
projection.toPixels(gPointA, pointA);
if (i == 0)
{ // This is the start point
startPoint = pointA;
path.moveTo(pointA.x, pointA.y);
}
else
{
if (i == _points.size() - 1)// This is the end point
endPoint = pointA;
path.lineTo(pointA.x, pointA.y);
}
}
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(_pathColor);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(3);
paint.setAlpha(90);
if (getDrawStartEnd())
{
if (startPoint != null)
{
drawOval(canvas, paint, startPoint);
}
if (endPoint != null)
{
drawOval(canvas, paint, endPoint);
}
}
if (!path.isEmpty())
canvas.drawPath(path, paint);
}
return super.draw(canvas, mapView, shadow, when);
}
public boolean getDrawStartEnd()
{
return _drawStartEnd;
}
public void setDrawStartEnd(boolean markStartEnd)
{
_drawStartEnd = markStartEnd;
}
}
MyMapActivity
package net.danielkvist;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
public class MyMapActivity extends MapActivity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
String url = "http://danielkvist.net/cprg_bef_cbana_polyline_simp1600.kml";
NavigationDataSet set = MapService.getNavigationDataSet(url);
drawPath(set, Color.parseColor("#6C8715"), mapView);
}
/**
* Does the actual drawing of the route, based on the geo points provided in
* the nav set
*
* @param navSet
* Navigation set bean that holds the route information, incl.
* geo pos
* @param color
* Color in which to draw the lines
* @param mMapView01
* Map view to draw onto
*/
public void drawPath(NavigationDataSet navSet, int color, MapView mMapView01)
{
ArrayList<GeoPoint> geoPoints = new ArrayList<GeoPoint>();
Collection overlaysToAddAgain = new ArrayList();
for (Iterator iter = mMapView01.getOverlays().iterator(); iter.hasNext();)
{
Object o = iter.next();
Log.d(BikeApp.APP, "overlay type: " + o.getClass().getName());
if (!RouteOverlay.class.getName().equals(o.getClass().getName()))
{
overlaysToAddAgain.add(o);
}
}
mMapView01.getOverlays().clear();
mMapView01.getOverlays().addAll(overlaysToAddAgain);
int totalNumberOfOverlaysAdded = 0;
for(Placemark placemark : navSet.getPlacemarks())
{
String path = placemark.getCoordinates();
if (path != null && path.trim().length() > 0)
{
String[] pairs = path.trim().split(" ");
String[] lngLat = pairs[0].split(","); // lngLat[0]=longitude
// lngLat[1]=latitude
// lngLat[2]=height
try
{
if(lngLat.length > 1 && !lngLat[0].equals("") && !lngLat[1].equals(""))
{
GeoPoint startGP = new GeoPoint(
(int) (Double.parseDouble(lngLat[1]) * 1E6),
(int) (Double.parseDouble(lngLat[0]) * 1E6));
GeoPoint gp1;
GeoPoint gp2 = startGP;
geoPoints = new ArrayList<GeoPoint>();
geoPoints.add(startGP);
for (int i = 1; i < pairs.length; i++)
{
lngLat = pairs[i].split(",");
gp1 = gp2;
if (lngLat.length >= 2 && gp1.getLatitudeE6() > 0
&& gp1.getLongitudeE6() > 0
&& gp2.getLatitudeE6() > 0
&& gp2.getLongitudeE6() > 0)
{
// for GeoPoint, first:latitude, second:longitude
gp2 = new GeoPoint(
(int) (Double.parseDouble(lngLat[1]) * 1E6),
(int) (Double.parseDouble(lngLat[0]) * 1E6));
if (gp2.getLatitudeE6() != 22200000)
{
geoPoints.add(gp2);
}
}
}
totalNumberOfOverlaysAdded++;
mMapView01.getOverlays().add(new RoutePathOverlay(geoPoints));
}
}
catch (NumberFormatException e)
{
Log.e(BikeApp.APP, "Cannot draw route.", e);
}
}
}
Log.d(BikeApp.APP, "Total overlays: " + totalNumberOfOverlaysAdded);
mMapView01.setEnabled(true);
}
@Override
protected boolean isRouteDisplayed()
{
// TODO Auto-generated method stub
return false;
}
}
编辑:当然还有一些我正在使用但我没有发布的文件。您可以在此处下载完整的 Eclipse 项目:http://danielkvist.net/se.zip
最佳答案
您是否考虑过渲染位图的所有路径,然后将其用作叠加层,当然,如果用户放大或缩小 map 或大量移动 map ,您将需要再次渲染它。将位图设置为屏幕的 2 或 4 倍(注意不要用完这里的所有内存),您应该能够进行一些放大和缩小操作,并允许进行一些平移,直到您需要为止再次渲染它。像四叉树一样渲染它(对树中的位图进行 week 引用)将允许进行一些缓存并可能大大提高性能。使用四叉树不是一种简单的方法,但如果您有时间和知识,可能值得付出努力。我相信这大致就是谷歌地图处理其 map 图 block 的方式。
关于具有超过 800 个 KML 数据叠加层的 Android map 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10140478/
您如何将城市与谷歌地球的 kml 曲线(线)联系起来? 最佳答案 首先,由于您在 SO 我假设您是从 KML 的角度询问,而不仅仅是在桌面应用程序中。 你需要有两个城市的坐标。然后,您将从 docs
我有一个在 map 上绘制并生成 kml 字符串的项目。我想通过 ajax 请求将其发送到 kml 文件。 $.ajax({ type: 'PUT', url: 'myurl.kml'
我需要深入研究 KML,所以我在网上查看规范和示例,但我得到了一些不一致的信息。 例如,有些网站说你写了 true 之类的东西。而其他人有1 ,而其他人则说不再需要 tessellate,因为 Alt
我想用谷歌地球每 10 秒加载一个 kml 文件,我找到了这个例子 http://ukhas.org.uk/code:kml_live_update但它似乎不起作用。
我有一个具有以下结构的巨大 kml 文件: 1.5 30ffa911
我想在我的 KML 中添加一个图例,无论您在 map 上的哪个位置,该图例都将始终位于同一位置。你怎么做到这一点?叠加层什么的?非常感谢 最佳答案 您可以使用屏幕覆盖添加静态图例(尽管您需要创建手动使
我试图让 gx:track 的线根据某些条件在轨道的不同部分具有不同的颜色,但我无法找到为轨道的一部分着色的方法。我正在使用 C# 生成 kml 文件。顺便说一句,我的 gx:track 有扩展数据。
我生成的 KML 文件可能有 50,000 个或更多地标,根据特定于域的分组排列在文件夹中。 KML 文件使用打包到 KMZ 文件中的自定义图像。 我希望将单个 KML 文件分解为多个文件,根据分组进
你好,我正在编写一些 KML,然后我按顺序创建了多重几何体 地标A地标 B 我不能选择 PlMark A 因为 B 更大,但是当我有 地标 B地标A 是的,因为我认为 A 较小并且它是最后一个被绘制的
我试图让 gx:track 的线路根据某些条件在轨道的不同部分具有不同的颜色,但我无法找到为轨道的部分着色的方法。我正在使用 C# 生成 kml 文件。顺便说一句,我的 gx:track 已经扩展了数
我正在构建一个为独立的 Google 地球客户端提供数据的应用程序。我想发送一组初始数据,然后使用 动态更新它和 标签随着服务器上的变化而变化。我正在使用 Java API for KML (JAK
我对 google earth 的 kml 文件有疑问。当我使用高度模式 clampToGround 时,它完全符合我的预期,它很好地跟随地面。 pm1kml
我正在从 ArcMap 图层创建 KML 文件,该图层使用 XSLT 生成带有文件夹自定义链接的 HTML 弹出窗口。其中一些链接有嵌入的空间。当我尝试在 Google 地球中打开这些链接时,它什么也
当我在 Excel 中打开 KML 文件时,同一地标的坐标与 Google Earth 中显示的坐标不同。例如,Google Earth 中显示的地标坐标点为 24.484138°、54.400700
这个问题困扰了我大约 2 天,谷歌并没有帮助我解决这个问题。基本上,下面的代码应该定义气球内的文本。不幸的是,它不是那样工作的。如果 GE 无法处理 KML 中定义的样式,我们最终会得到似乎是后备方案
Google map 是否像 Google 地球一样支持 KML 区域? 谷歌在这里给出了一个很好的区域描述/教程: https://developers.google.com/kml/documen
我创建了一个具有 15.439 轮廓的 kml 文件,每个文件都有 360 个坐标。文件大小为 369Mb。 当我尝试打开文件时,Google 地球显示一条消息: “Google 地球遇到问题需要关闭
我的 KML 地标具有这样填充的描述元素 someTag ]]> 使用 Google 地球 5,当您点击气球中的链接时,kml 将按预期下载并显示。 使用 Google 地球专业版 6,当您点击气
我正在读取 Kml 文件,更改地标的名称,然后再次保存。 var KmlFile = XDocument.Load("C:\\Inetpub\\wwwroot\\GeotagService\\Kml\
您好,我有一个多几何图形,当您将鼠标传递给线条时,样式如何像翻转一样,我的问题是多几何图形中的不同线串可能具有不同的颜色? 在下一个示例中,当您选择样式时,我有地标 Durham Tees Valle
我是一名优秀的程序员,十分优秀!