gpt4 book ai didi

android - 使用 Android 中的 Google Maps API 检查点是否在多边形中

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:42:42 27 4
gpt4 key购买 nike

我在 Android 上使用 Google Maps API 来创建拼图。此链接包含我用来绘制非洲国家的数据:World countries coordinates .

当用户点击 map 时,会进行测试以检查它是否位于正确的国家/地区。

  • 在正确的国家内点:正确的国家是绿色的

  • 指向另一个已知国家:当前国家以红色标示

下面的代码遍历非洲国家列表(一个国家可能包含多个多边形)以找到包含点击点的国家并将其与正确的国家进行比较。

mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {

if(isPointInPolygon(latLng,answerPolygon)) {
// right answer
Toast.makeText(MapsActivity.this, "point inside the right polygon", Toast.LENGTH_SHORT).show();
Polygon p = mMap.addPolygon(new PolygonOptions().addAll(answerPolygon));
p.setStrokeWidth(p.getStrokeWidth()/5);
p.setFillColor(0x7F00FF00);
}
else {
// wrong answer
// search current polygon
// color current polygon in red
if (colorPolygonInRed(latLng)){
Polygon p = mMap.addPolygon(new PolygonOptions().addAll(answerPolygon));
p.setStrokeWidth(p.getStrokeWidth()/5);
p.setFillColor(0x7F00FF00);
Toast.makeText(MapsActivity.this, "point in known polygons", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(MapsActivity.this, "point in unknown polygons", Toast.LENGTH_SHORT).show();
}
}
}
});

函数 isPointInPolygon() 仅适用于 map 上的一个多边形,因为它基于几何(射线相交)。它在我的情况下不起作用。例如,当我在乍得国内单击(this picture 中的蓝点)时,埃及会变成红色(我的列表按字母顺序排序,因此埃及是验证射线的单击点右侧的第一个相交条件)。

public boolean rayCastIntersect(LatLng tap, LatLng vertA, LatLng vertB) {
double aY = vertA.latitude;
double bY = vertB.latitude;
double aX = vertA.longitude;
double bX = vertB.longitude;
double pY = tap.latitude;
double pX = tap.longitude;

if ( (aY>pY && bY>pY) || (aY<pY && bY<pY) || (aX<pX && bX<pX) ) {
return false; // a and b can't both be above or below pt.y, and a or b must be east of pt.x
}

double m = (aY-bY) / (aX-bX); // Rise over run
double bee = (-aX) * m + aY; // y = mx + b
double x = (pY - bee) / m; // algebra is neat!

return x > pX;
}
public boolean colorPolygonInRed(LatLng point){
for (Country country:countryList){
for (ArrayList<LatLng> polygon : country.getCoordinates()){
if(isPointInPolygon(point,polygon)) {
Polygon p = mMap.addPolygon(new PolygonOptions().addAll(polygon));
p.setStrokeWidth(p.getStrokeWidth()/5);
p.setFillColor(0x7FE00808);
return true;
}
}
}
return false;
}

获取从我的列表中单击的多边形的正确方法是什么?

最佳答案

您可以使用 Google Maps Android API Utility Library 中的 PolyUtil.containsLocation 方法.来自 the documentation :

public static boolean containsLocation(LatLng point, java.util.List polygon, boolean geodesic)

Computes whether the given point lies inside the specified polygon. The polygon is always considered closed, regardless of whether the last point equals the first or not. Inside is defined as not containing the South Pole -- the South Pole is always outside. The polygon is formed of great circle segments if geodesic is true, and of rhumb (loxodromic) segments otherwise.

关于android - 使用 Android 中的 Google Maps API 检查点是否在多边形中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41203225/

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