去年,我建立了一个广泛的多层系统,以创建一个qtr-mins网格。它运作良好。 我的客户现在想要传入行(LatLng的两个节点),并希望我返回它接触的Qtr Mins。 FWIW,QtrMin是一个1/60/4(1/4分钟)到1/60/4的多边形。
以下是精简版脚本。我有一个入口函数,我将传入行节点,我将编写一个外部函数来传递触及的QtrMins。
问题的一部分是我从折线绘制了我的Qtr Mins,但事实就是如此。
我将通过Delphi利用脚本并进行函数调用以传入Lat / Lng对。
function getQtrMinTouched(oLat,oLng, fLat,fLng){
// Lost and confused here
}
并根据结果的返回方式,我将通过com对象调用将QtrMin传递给我的程序。将参数传递给函数并传递结果已经解决了。包括这里的内容将贡献很少,但需要几个模块才能简单运行。 我的问题是:使用我在下面创建的网格,有没有办法确定哪些网格被一条线(LatLng,LatLng)触及?一条线可能跨越多个网格。一条线总是被定义为两个节点(LatLng,LatLng)。
<html>
<head>
<title>Find your Qtr minute locator
</title>
<script type="text/javascript"
src="https://maps.googleapis.com/maps/api/js?v=3.24&libraries=geometry">
</script>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
<body>
<div id="map-canvas" style="HEIGHT: 100%; WIDTH: 100%" onclick=""></div>
<div id="map"></div>
<script type="text/javascript">
var map;
var llOffset = 1/60/4;
var qtrNELatLngCode;
var qtrNorth;
var qtrEast;
var qtrSWLatLngCode;
var qtrSouth;
var qtrWest;
var latPolylines = [];
var lngPolylines = [];
var lngLabels = [];
function initialize() {
geocoder = new google.maps.Geocoder();
map = new google.maps.Map(document.getElementById("map-canvas"), {
center: new google.maps.LatLng(34.0, -84.0),
zoom: 16,
streetViewControl: true,
mapTypeId: google.maps.MapTypeId.ROADMAP,
scaleControl: true
});
google.maps.event.addListener(map, "idle", function () {
var sLat = map.getCenter().lat();
var sLng = map.getCenter().lng();
//external.ShowMarker(sLat,sLng);
createGridLines(map.getBounds());
});
} // initialize
google.maps.event.addDomListener(window, "load", initialize);
function createGridLines(bounds) {
for (var i = 0; i < latPolylines.length; i++) {
latPolylines[i].setMap(null);
}
latPolylines = [];
for (var j = 0; j < lngPolylines.length; j++) {
lngPolylines[j].setMap(null);
}
lngPolylines = [];
for (var k = 0; k < lngLabels.length; k++) {
lngLabels[k].setMap(null);
}
lngLabels = [];
if (map.getZoom() < 12) {
return;
}
var north = bounds.getNorthEast().lat();
var east = bounds.getNorthEast().lng();
var south = bounds.getSouthWest().lat();
var west = bounds.getSouthWest().lng();
// define the size of the grid
var topLat = Math.ceil(north / llOffset) * llOffset;
var rightLong = Math.ceil(east / llOffset) * llOffset;
var bottomLat = Math.floor(south / llOffset) * llOffset;
var leftLong = Math.floor(west / llOffset) * llOffset;
qtrNELatLngCode = ddToQM(topLat, rightLong);
qtrNorth = qtrNELatLngCode.substring(0, 5);
qtrEast = qtrNELatLngCode.substring(5, 12);
qtrSWLatLngCode = ddToQM(bottomLat, leftLong);
qtrSouth = qtrSWLatLngCode.substring(0, 5);
qtrWest = qtrSWLatLngCode.substring(5, 12);
for (var latitude = bottomLat; latitude <= topLat; latitude += llOffset) latPolylines.push(new google.maps.Polyline({
path: [
new google.maps.LatLng(latitude, leftLong), new google.maps.LatLng(latitude, rightLong)],
map: map,
geodesic: true,
strokeColor: "#0000FF",
strokeOpacity: 0.1,
strokeWeight: 1
}));
for (var longitude = leftLong; longitude <= rightLong; longitude += llOffset) lngPolylines.push(new google.maps.Polyline({
path: [
new google.maps.LatLng(topLat, longitude), new google.maps.LatLng(bottomLat, longitude)],
map: map,
geodesic: true,
strokeColor: "#0000FF",
strokeOpacity: 0.1,
strokeWeight: 1
}));
if ((map.getZoom() < 16)) {
for (var l = 0; l < lngLabels.length; l++) {
lngLabels[l].setMap(null);
}
lngLabels = [];
return;
} // set lngLabels to null
for (var x = 0; x < latPolylines.length; ++x) {
for (var y = 0; y < lngPolylines.length; ++y) {
var latLng = new google.maps.LatLng(latPolylines[x].getPath().getAt(0).lat(),
lngPolylines[y].getPath().getAt(0).lng());
var qtrLatLng = ddToQM(latLng.lat(), latLng.lng());
线是否触摸此网格?我认为在绘制顶点时,我会测试是否该线(知道(latlng,latlng))。
lngLabels.push(new google.maps.Marker({
map: map,
position: latLng,
icon: {
url: "https://chart.googleapis.com/chart?"
+ "chst=d_bubble_text_small&chld=bbbr|"
+ qtrLatLng
+ "|FFFFFF|000000",
anchor: new google.maps.Point(126, 42)
}
}));
}
}
} // end createGridLines
function getQtrMinTouched(oLat,oLng, fLat,fLng){
// Lost and confused here
}
function ddToQM(alat, alng) {
var latResult, lngResult, dmsResult;
alat = parseFloat(alat);
alng = parseFloat(alng);
latResult = "";
lngResult = "";
latResult += getDms(alat);
lngResult += getDms(alng);
dmsResult = latResult + lngResult;
// Return the resultant string.
return dmsResult;
}
function getDms(val) {
// Required variables
var valDeg, valMin, valSec, interimResult;
var qtrMin;
val = Math.abs(val);
// ---- Degrees ----
valDeg = Math.floor(val);
valMin = Math.floor((val - valDeg) * 60);
valSec = Math.round((val - valDeg - valMin / 60) * 3600 * 1000) / 1000;
if (valSec == 60) {
valMin += 1;
valSec = 0;
}
if (valMin == 60) {
valMin += 1;
valSec = 0;
}
interimResult = valDeg + "";
if (valMin < 10) {
valMin = "0" + valMin;
}
interimResult += valMin + "";
switch (valSec) {
case 0 :
qtrMin = "D";
break;
case 15 :
qtrMin = "C";
break;
case 30 :
qtrMin = "B";
break;
case 45 :
qtrMin = "A";
break;
}
interimResult += qtrMin;
return interimResult;
}
</script>
</body>
</html>