使用素面查找多边形区域
Finding polygon area with primefaces
我正在尝试使用素面查找多边形的区域。我能够放下标记并创建一个多边形并使其显示。我希望将多边形置于 JavaScript geometry API 函数调用之下,但我无法访问已绘制的多边形,因为它是由支持 bean 创建的。我目前的计划是有两个表示相同多边形的多边形对象,一个在纯 JavaScript 中,一个在 Google Maps/Prime 面中,但我不确定它是否会起作用。这是我目前所拥有的:
<p:gmap id="gmap" center="52.561201, -9.256510" zoom="13" type="HYBRID" style="width:100%;height:400px"
model="#{map.emptyModel}" onPointClick="handlePointClick(event);" widgetVar="map" />
<p:dialog widgetVar="dlg" showEffect="fade">
<h:form prependId="false">
<h:panelGrid columns="2">
<h:outputLabel for="title" value="Are you Sure?" />
<f:facet name="footer">
<p:commandButton value="Yes" actionListener="#{map.addMarker}" update=":messages" oncomplete="markerAddComplete()" />
<p:commandButton value="No" onclick="return cancel()" />
</f:facet>
</h:panelGrid>
<h:inputHidden id="lat" value="#{map.lat}" />
<h:inputHidden id="lng" value="#{map.lng}" />
<h:inputHidden id="area" value="#{map.area}" />
</h:form>
</p:dialog>
<script type="text/javascript">
var currentMarker = null;
var markers = [];
var path = new google.maps.MVCArray;
var poly;
function handlePointClick(event) {
//if statement handles bean markers and coordinates
if (currentMarker === null) {
document.getElementById('lat').value = event.latLng.lat();
document.getElementById('lng').value = event.latLng.lng();
currentMarker = new google.maps.Marker({
position: new google.maps.LatLng(event.latLng.lat(), event.latLng.lng())
});
PF('map').addOverlay(currentMarker);
PF('dlg').show();
}
// javascript to mimic polygon copy
path.insertAt(path.length, event.latLng);
poly = new google.maps.Polygon();
poly.setPaths(new google.maps.MVCArray([path]));
document.getElementById('area').value = document.getElementById('area').value = google.maps.geometry.spherical.computeArea(measure.polygon.getPath());
console.log(path);
}
if 语句中的所有内容都与位于脚本上方的 xhtml 代码相关,下面的所有内容都是我尝试获取该区域,但它不起作用。如果有人对如何在主要面中实现多边形区域有任何想法,请分享,谢谢。
如果您无论如何都在您的应用程序中使用 JavaScript,那么只要有一个 Google 地图事件侦听器在用户单击地图的一部分时构建多边形可能会更容易,或者当你使用某种菜单手动输入一个点时(我想你已经在做了):
var polygonCoords = [];
//can be called using forms
function addMarker(lat, lng){ //split apart from google.maps.latLng to make compatible with form
polygonCoords.push(new google.maps.LatLng(lat, lng));
}
google.maps.event.addListener(map, 'click', function(event){
addPoint(event.latLng.lat(), event.latLng.lng());
}
function getArea(pts){
return google.maps.geometry.spherical.computeArea(pts);
}
//to get area do:
getArea(polygonCoords);
//this will return a float of the area
此解决方案需要包含 geometry library。
我没有包含用于显示(或实际制作!)多边形的代码,因为我不确定您要如何操作。另外,制作多边形不需要计算它的面积。
据我了解,PrimeFaces 的用法与 jQuery 类似。话虽如此,我认为使用 PrimeFaces 检索坐标并不重要,尤其是当 Google 地图已经更好地支持它时。
我正在尝试使用素面查找多边形的区域。我能够放下标记并创建一个多边形并使其显示。我希望将多边形置于 JavaScript geometry API 函数调用之下,但我无法访问已绘制的多边形,因为它是由支持 bean 创建的。我目前的计划是有两个表示相同多边形的多边形对象,一个在纯 JavaScript 中,一个在 Google Maps/Prime 面中,但我不确定它是否会起作用。这是我目前所拥有的:
<p:gmap id="gmap" center="52.561201, -9.256510" zoom="13" type="HYBRID" style="width:100%;height:400px"
model="#{map.emptyModel}" onPointClick="handlePointClick(event);" widgetVar="map" />
<p:dialog widgetVar="dlg" showEffect="fade">
<h:form prependId="false">
<h:panelGrid columns="2">
<h:outputLabel for="title" value="Are you Sure?" />
<f:facet name="footer">
<p:commandButton value="Yes" actionListener="#{map.addMarker}" update=":messages" oncomplete="markerAddComplete()" />
<p:commandButton value="No" onclick="return cancel()" />
</f:facet>
</h:panelGrid>
<h:inputHidden id="lat" value="#{map.lat}" />
<h:inputHidden id="lng" value="#{map.lng}" />
<h:inputHidden id="area" value="#{map.area}" />
</h:form>
</p:dialog>
<script type="text/javascript">
var currentMarker = null;
var markers = [];
var path = new google.maps.MVCArray;
var poly;
function handlePointClick(event) {
//if statement handles bean markers and coordinates
if (currentMarker === null) {
document.getElementById('lat').value = event.latLng.lat();
document.getElementById('lng').value = event.latLng.lng();
currentMarker = new google.maps.Marker({
position: new google.maps.LatLng(event.latLng.lat(), event.latLng.lng())
});
PF('map').addOverlay(currentMarker);
PF('dlg').show();
}
// javascript to mimic polygon copy
path.insertAt(path.length, event.latLng);
poly = new google.maps.Polygon();
poly.setPaths(new google.maps.MVCArray([path]));
document.getElementById('area').value = document.getElementById('area').value = google.maps.geometry.spherical.computeArea(measure.polygon.getPath());
console.log(path);
}
if 语句中的所有内容都与位于脚本上方的 xhtml 代码相关,下面的所有内容都是我尝试获取该区域,但它不起作用。如果有人对如何在主要面中实现多边形区域有任何想法,请分享,谢谢。
如果您无论如何都在您的应用程序中使用 JavaScript,那么只要有一个 Google 地图事件侦听器在用户单击地图的一部分时构建多边形可能会更容易,或者当你使用某种菜单手动输入一个点时(我想你已经在做了):
var polygonCoords = [];
//can be called using forms
function addMarker(lat, lng){ //split apart from google.maps.latLng to make compatible with form
polygonCoords.push(new google.maps.LatLng(lat, lng));
}
google.maps.event.addListener(map, 'click', function(event){
addPoint(event.latLng.lat(), event.latLng.lng());
}
function getArea(pts){
return google.maps.geometry.spherical.computeArea(pts);
}
//to get area do:
getArea(polygonCoords);
//this will return a float of the area
此解决方案需要包含 geometry library。
我没有包含用于显示(或实际制作!)多边形的代码,因为我不确定您要如何操作。另外,制作多边形不需要计算它的面积。
据我了解,PrimeFaces 的用法与 jQuery 类似。话虽如此,我认为使用 PrimeFaces 检索坐标并不重要,尤其是当 Google 地图已经更好地支持它时。