检测标记是否在视点内
Detect if marker is in view point
我正在使用 react-native-maps。我有一个项目列表,我将其作为标记显示在地图中。
如何检测标记是否在用户在地图中搜索的范围内。
我尝试使用 react-native-component-inview 包,但它不起作用。
这是我的完整 MapView
代码
<MapView
ref={mapRef}
provider="google"
initialRegion={tripdata.pickup ? initialRegion : qatarRegion}
onRegionChange={onRegionChange}
onRegionChangeComplete={onRegionChangeComplete}
>
{mapAds
? mapAds.map((item, index) => {
return (
<Marker
onPress={() => mapEngagement(item.id)}
coordinate={{
latitude: item.lat ? item.lat : 0.0,
longitude: item.lng ? item.lng : 0.0,
}}
key={index}
>
<TouchableOpacity
style={{
width: 50,
height: 50,
backgroundColor: colors.GREY.YELLOW,
borderRadius: 100,
justifyContent: "center",
alignItems: "center",
}}
>
<Image
source={{
uri: item.logo
? item.logo
: "https://firebasestorage.googleapis.com/v0/b/faroutdrive001.appspot.com/o/corporations%2F-McAZ_l4YQ4X4Hg71dTF%2Flogo?alt=media&token=de3aff61-0deb-4cea-a3f0-0e0b491146b1",
}}
style={{
height: 47,
width: 47,
zIndex: 2,
borderRadius: 100,
}}
/>
{/* <Text>{visible}</Text> */}
</TouchableOpacity>
<Callout tooltip>
<View style={{ padding: 3 }}>
<TouchableOpacity
style={{
backgroundColor: colors.GREY.YELLOW,
justifyContent: "space-evenly",
alignItems: "center",
minWidth: 120,
maxWidth: 150,
minHeight: 50,
borderRadius: 10,
}}
>
<Text style={{ color: colors.WHITE }}>
{item.ad_name ? item.ad_name : "Advertise Here"}
</Text>
<Text style={{ color: colors.WHITE, fontSize: 12 }}>
{item.ad_description ? item.ad_description : ""}
</Text>
</TouchableOpacity>
</View>
</Callout>
</Marker>
);
})
: null}
</MapView>
您描述的问题 space 称为“多边形中的点”问题。基本上你的地图视图隐含了 latitude/longitude 边界,你需要知道一个点(即你的标记)是否包含在多边形(你的地图视图边界)中。
有几种方法可以解决这个问题。长话短说,除非您想了解和实施涉及测地线和半正弦公式的地理数学和算法,否则我建议您改为利用一个好的包来完成困难的部分。我使用 TurfJS 来做到这一点。我不以任何方式代表他们或他们的社区,但它似乎制作精良,我很喜欢使用 JS 和 Java 实现来解决这样的问题。
对于这个特殊问题,我建议您参考这里:
https://www.npmjs.com/package/@turf/boolean-point-in-polygon
基本上你会想要使用他们提供的示例,我将其复制到这里以供后代使用,以防 link 发生变化:
var pt = turf.point([-77, 44]);
var poly = turf.polygon([[
[-81, 41],
[-81, 47],
[-72, 47],
[-72, 41],
[-81, 41]
]]);
turf.booleanPointInPolygon(pt, poly);
//= true
注意:注意 lat/lng 正确指向您正在使用的任何库!
对于您来说,多边形将是地图的边界点。请注意,该库并不假设您有一个漂亮、整洁的“4 角正方形”地图视图(当然,在地球上它不完全是正方形),但您需要将地图视图的 4 角正方形转换为5个边缘点。 (第一点和最后一点相同)。
然后您可以将标记的 lat/lng 翻译成“pt”并用它来询问引擎的问题。
对于您的点(标记)是否在边界(地图视图)中,结果应该是直观的true/false。
另一个注意事项。注意如何指定边界点。单击讨论“多边形/多边形”的页面中的 link。您想遵循简单 MapView 的多边形规则。如果您以错误的顺序指定边界点,它可能会以意想不到且完全混乱的方式对其进行解释。
Polygon 的 link 详细讨论了它,但我会提请您注意以下部分:
3.1.6. Polygon
To specify a constraint specific to Polygons....
o A linear ring MUST follow the right-hand rule with respect to the
area it bounds, i.e., exterior rings are counterclockwise...
我正在使用 react-native-maps。我有一个项目列表,我将其作为标记显示在地图中。 如何检测标记是否在用户在地图中搜索的范围内。 我尝试使用 react-native-component-inview 包,但它不起作用。 这是我的完整 MapView
代码<MapView
ref={mapRef}
provider="google"
initialRegion={tripdata.pickup ? initialRegion : qatarRegion}
onRegionChange={onRegionChange}
onRegionChangeComplete={onRegionChangeComplete}
>
{mapAds
? mapAds.map((item, index) => {
return (
<Marker
onPress={() => mapEngagement(item.id)}
coordinate={{
latitude: item.lat ? item.lat : 0.0,
longitude: item.lng ? item.lng : 0.0,
}}
key={index}
>
<TouchableOpacity
style={{
width: 50,
height: 50,
backgroundColor: colors.GREY.YELLOW,
borderRadius: 100,
justifyContent: "center",
alignItems: "center",
}}
>
<Image
source={{
uri: item.logo
? item.logo
: "https://firebasestorage.googleapis.com/v0/b/faroutdrive001.appspot.com/o/corporations%2F-McAZ_l4YQ4X4Hg71dTF%2Flogo?alt=media&token=de3aff61-0deb-4cea-a3f0-0e0b491146b1",
}}
style={{
height: 47,
width: 47,
zIndex: 2,
borderRadius: 100,
}}
/>
{/* <Text>{visible}</Text> */}
</TouchableOpacity>
<Callout tooltip>
<View style={{ padding: 3 }}>
<TouchableOpacity
style={{
backgroundColor: colors.GREY.YELLOW,
justifyContent: "space-evenly",
alignItems: "center",
minWidth: 120,
maxWidth: 150,
minHeight: 50,
borderRadius: 10,
}}
>
<Text style={{ color: colors.WHITE }}>
{item.ad_name ? item.ad_name : "Advertise Here"}
</Text>
<Text style={{ color: colors.WHITE, fontSize: 12 }}>
{item.ad_description ? item.ad_description : ""}
</Text>
</TouchableOpacity>
</View>
</Callout>
</Marker>
);
})
: null}
</MapView>
您描述的问题 space 称为“多边形中的点”问题。基本上你的地图视图隐含了 latitude/longitude 边界,你需要知道一个点(即你的标记)是否包含在多边形(你的地图视图边界)中。
有几种方法可以解决这个问题。长话短说,除非您想了解和实施涉及测地线和半正弦公式的地理数学和算法,否则我建议您改为利用一个好的包来完成困难的部分。我使用 TurfJS 来做到这一点。我不以任何方式代表他们或他们的社区,但它似乎制作精良,我很喜欢使用 JS 和 Java 实现来解决这样的问题。
对于这个特殊问题,我建议您参考这里:
https://www.npmjs.com/package/@turf/boolean-point-in-polygon
基本上你会想要使用他们提供的示例,我将其复制到这里以供后代使用,以防 link 发生变化:
var pt = turf.point([-77, 44]);
var poly = turf.polygon([[
[-81, 41],
[-81, 47],
[-72, 47],
[-72, 41],
[-81, 41]
]]);
turf.booleanPointInPolygon(pt, poly);
//= true
注意:注意 lat/lng 正确指向您正在使用的任何库!
对于您来说,多边形将是地图的边界点。请注意,该库并不假设您有一个漂亮、整洁的“4 角正方形”地图视图(当然,在地球上它不完全是正方形),但您需要将地图视图的 4 角正方形转换为5个边缘点。 (第一点和最后一点相同)。
然后您可以将标记的 lat/lng 翻译成“pt”并用它来询问引擎的问题。
对于您的点(标记)是否在边界(地图视图)中,结果应该是直观的true/false。
另一个注意事项。注意如何指定边界点。单击讨论“多边形/多边形”的页面中的 link。您想遵循简单 MapView 的多边形规则。如果您以错误的顺序指定边界点,它可能会以意想不到且完全混乱的方式对其进行解释。
Polygon 的 link 详细讨论了它,但我会提请您注意以下部分:
3.1.6. Polygon
To specify a constraint specific to Polygons....
o A linear ring MUST follow the right-hand rule with respect to the
area it bounds, i.e., exterior rings are counterclockwise...