Google Maps 多个多边形,从第一个多边形位置开始第二个多边形
Posted
技术标签:
【中文标题】Google Maps 多个多边形,从第一个多边形位置开始第二个多边形【英文标题】:Google Maps multiple polygon which starting the second polygon from the first polygon location 【发布时间】:2019-04-11 15:51:22 【问题描述】:我是 android 开发的新手。我正在尝试做多个多边形。我做到了,但第二个多边形是从第一个多边形的末端开始的。我已经列出了我关注的问题以及显示我的结果的图片。
Multiple Polygon On Map
How to draw free hand polygon in Google map V2 in Android?
My result
这是我的代码:
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback
private GoogleMap mMap;
private static final LatLng MainLocation = new LatLng(40.828070, -111.904610);
FrameLayout fram_map;
FloatingActionButton fab;
Boolean Is_MAP_Moveable = false;
Projection projection;
public double latitude;
public double longitude;
PolygonOptions rectOptions;
ArrayList < LatLng > val = new ArrayList < > ();
ArrayList < ArrayList < LatLng >> val2 = new ArrayList < > ();
Polygon polygon;
String LogName = "XEL";
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
fram_map = (FrameLayout) findViewById(R.id.fram_map);
fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
if (Is_MAP_Moveable)
Is_MAP_Moveable = false;
if (val2.isEmpty())
val2.add(0, val);
else
val2.add(val2.size(), val);
else
Is_MAP_Moveable = true;
);
fram_map.setOnTouchListener(new View.OnTouchListener()
@Override
public boolean onTouch(View v, MotionEvent event)
if (Is_MAP_Moveable)
float x = event.getX();
float y = event.getY();
int x_co = Math.round(x);
int y_co = Math.round(y);
projection = mMap.getProjection();
Point x_y_points = new Point(x_co, y_co);
LatLng latLng = mMap.getProjection().fromScreenLocation(x_y_points);
latitude = latLng.latitude;
longitude = latLng.longitude;
int eventaction = event.getAction();
switch (eventaction)
case MotionEvent.ACTION_DOWN:
val.add(new LatLng(latitude, longitude));
case MotionEvent.ACTION_MOVE:
val.add(new LatLng(latitude, longitude));
case MotionEvent.ACTION_UP:
Draw_Map();
break;
else
Toast.makeText(MainActivity.this, "Please start the zone", Toast.LENGTH_SHORT).show();
return Is_MAP_Moveable;
);
@Override
public void onMapReady(GoogleMap googleMap)
mMap = googleMap;
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
googleMap.setOnPolygonClickListener(new GoogleMap.OnPolygonClickListener()
@Override
public void onPolygonClick(Polygon polygon)
Toast.makeText(MainActivity.this, polygon.getPoints().toString(), Toast.LENGTH_SHORT).show();
);
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(MainLocation,
20));
public void Draw_Map()
/* for (int i = 0; i < val2.size(); i++)
rectOptions = new PolygonOptions();
rectOptions.addAll(val2.get(i));
rectOptions.strokeColor(Color.BLUE);
rectOptions.strokeWidth(7);
rectOptions.fillColor(Color.CYAN);
polygon = mMap.addPolygon(rectOptions);
polygon.setClickable(true);
*/
rectOptions = new PolygonOptions();
rectOptions.addAll(val);
rectOptions.strokeColor(Color.BLUE);
rectOptions.strokeWidth(7);
rectOptions.fillColor(Color.CYAN);
polygon = mMap.addPolygon(rectOptions);
polygon.setClickable(true);
【问题讨论】:
得到答案了吗?问题解决了吗? 【参考方案1】:从概述中,我可以提出一些建议。如果您实施这些事情,问题可能会得到解决:
现在做一个单独的 onClick 用户。使用 onTouch。
//declare globally
float init_x, init_y;
float tolerance = 5;
fram_map.setOnTouchListener(new View.OnTouchListener()
@Override
public boolean onTouch(View v, MotionEvent event)
switch (event.getAction())
case MotionEvent.ACTION_DOWN:
init_x = event.getX();
init_y = event.getY();
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
float x = event.getX();
float y = event.getY();
Is_MAP_Moveable = Math.abs(init_x - x) > tolerance || Math.abs(init_y - y) > tolerance;
if(!Is_MAP_Moveable)
int x_co = Math.round(x);
int y_co = Math.round(y);
projection = mMap.getProjection();
Point x_y_points = new Point(x_co, y_co);
LatLng latLng = mMap.getProjection().fromScreenLocation(x_y_points);
latitude = latLng.latitude;
longitude = latLng.longitude;
val.add(new LatLng(latitude, longitude));
Draw_Map();
else
Toast.makeText(MainActivity.this, "Please start the zone", Toast.LENGTH_SHORT).show();
break;
return Is_MAP_Moveable;
);
不需要使用 ArrayList of ArrayLists of LatLng - val2。使用 val 绘制多边形。
在覆盖任何新多边形之前清除地图上的所有多边形,因为您要在 ArrayList 中推送元素。在添加新多边形之前使用polygon.remove();
。
【讨论】:
什么都没有发生,甚至多边形都在绘制以上是关于Google Maps 多个多边形,从第一个多边形位置开始第二个多边形的主要内容,如果未能解决你的问题,请参考以下文章
如何在google maps api中为省或某个城市提供一些颜色?