我尝试阅读各种博客和代码,但无法实现目标
我在下面使用了以下代码 fragment :
private void DrawArrowHead(MarkerOptions MO, GoogleMap mMap, LatLng from, LatLng to) {
// obtain the bearing between the last two points
double bearing = GetBearing(from, to);
// round it to a multiple of 3 and cast out 120s
double adjBearing = Math.round(bearing / 3) * 3;
while (adjBearing >= 120) {
adjBearing -= 120;
}
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
// Get the corresponding triangle marker from Google
URL url;
Bitmap image = null;
try {
url = new URL("http://www.google.com/intl/en_ALL/mapfiles/dir_" + String.valueOf((int) adjBearing) + ".png");
try {
// image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
Log.d("HistoryDisplay", String.valueOf(adjBearing));
// image = BitmapFactory.decodeResource(getResources(), R.drawable.arrow);
image = BitmapFactory.decodeResource(getResources(), allArrow.get((int) adjBearing));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (image != null) {
// Anchor is ratio in range [0..1] so value of 0.5 on x and y will center the marker image on the lat/long
float anchorX = 0.5f;
float anchorY = 0.5f;
int offsetX = 0;
int offsetY = 0;
// images are 24px x 24px
// so transformed image will be 48px x 48px
//315 range -- 22.5 either side of 315
if (bearing >= 292.5 && bearing < 335.5) {
offsetX = 24;
offsetY = 24;
}
//270 range
else if (bearing >= 247.5 && bearing < 292.5) {
offsetX = 24;
offsetY = 12;
}
//225 range
else if (bearing >= 202.5 && bearing < 247.5) {
offsetX = 24;
offsetY = 0;
}
//180 range
else if (bearing >= 157.5 && bearing < 202.5) {
offsetX = 12;
offsetY = 0;
}
//135 range
else if (bearing >= 112.5 && bearing < 157.5) {
offsetX = 0;
offsetY = 0;
}
//90 range
else if (bearing >= 67.5 && bearing < 112.5) {
offsetX = 0;
offsetY = 12;
}
//45 range
else if (bearing >= 22.5 && bearing < 67.5) {
offsetX = 0;
offsetY = 24;
}
//0 range - 335.5 - 22.5
else {
offsetX = 12;
offsetY = 24;
}
Bitmap wideBmp;
Canvas wideBmpCanvas;
Rect src, dest;
// Create larger bitmap 4 times the size of arrow head image
wideBmp = Bitmap.createBitmap(image.getWidth() * 2, image.getHeight() * 2, image.getConfig());
wideBmpCanvas = new Canvas(wideBmp);
src = new Rect(0, 0, image.getWidth(), image.getHeight());
dest = new Rect(src);
dest.offset(offsetX, offsetY);
wideBmpCanvas.drawBitmap(image, src, dest, null);
// MO.position(to);
MO.icon(BitmapDescriptorFactory.fromBitmap(wideBmp));
MO.anchor(anchorX, anchorY);
mMap.addMarker(MO);
// mMap.addMarker(new MarkerOptions()
// .position(to)
// .icon(BitmapDescriptorFactory.fromBitmap(wideBmp))
// .anchor(anchorX, anchorY));
}
}
private double GetBearing(LatLng from, LatLng to) {
double lat1 = from.latitude * Math.PI / 180.0;
double lon1 = from.longitude * Math.PI / 180.0;
double lat2 = to.latitude * Math.PI / 180.0;
double lon2 = to.longitude * Math.PI / 180.0;
// Compute the angle.
double angle = -Math.atan2(Math.sin(lon1 - lon2) * Math.cos(lat2), Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2));
if (angle < 0.0)
angle += Math.PI * 2.0;
// And convert result to degrees.
angle = angle * degreesPerRadian;
return angle;
}
最佳答案
画箭头最好的方法是使用'Marker'到 map 并将其定位在与线的终点或起点相同的位置。您需要将其放平并手动设置其旋转。
幸运的是,Google Maps Utils 可以帮助计算航向(旋转)。
只需将 compile 'com.google.maps.android:android-maps-utils:0.3.4' 添加为 build.gradle 文件中的依赖项
public static void double computeHeading(LatLng from, LatLng to)
使用 Double HeadingRotation = SphericalUtil.computeHeading(LatLng from, LatLng to)
将值(以度为单位)设置为标记旋转。
箭头可以是一个简单的位图,或者更好的是一个可绘制的 Shape .
关于Android 在带有方向路径的谷歌地图上绘制带箭头的多段线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35626926/
如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做
我需要根据字符串路径的长度将字符串路径数组转换为符号、哈希和数组的数组给定以下数组:array=["info","services","about/company","about/history/part1","about/history/part2"]我想生成以下输出,对不同级别进行分组,根据级别的结构混合使用符号和对象。产生以下输出:[:info,:services,about:[:company,history:[:part1,:part2]]]#altsyntax[:info,:services,{:about=>[:company,{:history=>[:part1,:pa
假设我有一个类A,里面有一些方法。假设stringmethodName是这些方法之一,我已经知道我想给它什么参数。它们在散列中{'param1'=>value1,'param2'=>value2}所以我有:params={'param1'=>value1,'param2'=>value2}a=A.new()a.send(methodName,value1,value2)#callmethodnamewithbothparams我希望能够通过传递我的哈希以某种方式调用该方法。这可能吗? 最佳答案 确保methodName是一个符号,而
当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question
我了解instance_eval和class_eval之间的基本区别。我在玩弄时发现的是一些涉及attr_accessor的奇怪东西。这是一个例子:A=Class.newA.class_eval{attr_accessor:x}a=A.newa.x="x"a.x=>"x"#...expectedA.instance_eval{attr_accessor:y}A.y="y"=>NoMethodError:undefinedmethod`y='forA:Classa.y="y"=>"y"#WHATTT?这是怎么回事:instance_eval没有访问我们的A类(对象)然后它实际上将它添加到
Organization和Image具有一对一的关系。Image有一个名为filename的列,它存储文件的路径。我在Assets管道中包含这样一个文件:app/assets/other/image.jpg。播种时如何包含此文件的路径?我已经在我的种子文件中尝试过:@organization=...@organization.image.create!(filename:File.open('app/assets/other/image.jpg'))#Ialsotried:#@organization.image.create!(filename:'app/assets/other/i
我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'
如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail