ฉันรู้วิธีการข้างต้นโดยใช้ Esri (งาน Query on shapefile) แต่สิ่งนี้สามารถทำได้โดยใช้ Google Maps? ฉันต้องสอบถามรูปหลายเหลี่ยมแต่ละอันหรือมีวิธีหนึ่งในการสืบค้นชุดรูปหลายเหลี่ยมหรือไม่
ฉันรู้วิธีการข้างต้นโดยใช้ Esri (งาน Query on shapefile) แต่สิ่งนี้สามารถทำได้โดยใช้ Google Maps? ฉันต้องสอบถามรูปหลายเหลี่ยมแต่ละอันหรือมีวิธีหนึ่งในการสืบค้นชุดรูปหลายเหลี่ยมหรือไม่
คำตอบ:
API Google maps ไม่ได้มีวิธีการตรวจสอบคะแนนเป็นรูปหลายเหลี่ยม หลังจากค้นคว้าสักเล็กน้อยฉันก็เจออัลกอริธึมการหล่อเรย์ซึ่งจะตรวจสอบว่าพิกัด XY อยู่ในรูปพล็อตหรือไม่ สิ่งนี้จะแปลเป็นละติจูดและลองจิจูด ต่อไปนี้จะขยาย google.maps.polygon.prototype เพื่อใช้อัลกอริทึมนี้ เพียงรวมรหัสนี้ไว้ที่จุดในโค้ดหลังจากโหลด google.maps แล้ว:
google.maps.Polygon.prototype.Contains = function (point) {
var crossings = 0,
path = this.getPath();
// for each edge
for (var i = 0; i < path.getLength(); i++) {
var a = path.getAt(i),
j = i + 1;
if (j >= path.getLength()) {
j = 0;
}
var b = path.getAt(j);
if (rayCrossesSegment(point, a, b)) {
crossings++;
}
}
// odd number of crossings?
return (crossings % 2 == 1);
function rayCrossesSegment(point, a, b) {
var px = point.lng(),
py = point.lat(),
ax = a.lng(),
ay = a.lat(),
bx = b.lng(),
by = b.lat();
if (ay > by) {
ax = b.lng();
ay = b.lat();
bx = a.lng();
by = a.lat();
}
// alter longitude to cater for 180 degree crossings
if (px < 0) {
px += 360;
}
if (ax < 0) {
ax += 360;
}
if (bx < 0) {
bx += 360;
}
if (py == ay || py == by) py += 0.00000001;
if ((py > by || py < ay) || (px > Math.max(ax, bx))) return false;
if (px < Math.min(ax, bx)) return true;
var red = (ax != bx) ? ((by - ay) / (bx - ax)) : Infinity;
var blue = (ax != px) ? ((py - ay) / (px - ax)) : Infinity;
return (blue >= red);
}
};
ที่นี่เราได้ขยายการทำงานของ google.maps.Polygon โดยการกำหนดฟังก์ชั่นด้วยชื่อ 'มี' ซึ่งสามารถใช้เพื่อตรวจสอบว่าละติจูดลองจิจูดที่ให้ไว้ในพารามิเตอร์ฟังก์ชั่นอยู่ภายในรูปหลายเหลี่ยมหรือไม่ ที่นี่เราใช้ประโยชน์จากอัลกอริทึมการหล่อเรย์และพัฒนาฟังก์ชั่นที่ใช้เหมือนกัน หลังจากออกกำลังกายมากตอนนี้เราสามารถตรวจสอบประเด็นต่อไปนี้:
var point = new google.maps.LatLng(52.05249047600099, -0.6097412109375);
var polygon = new google.maps.Polygon({path:[INSERT_PATH_ARRAY_HERE]});
if (polygon.Contains(point)) {
// point is inside polygon
}
สำหรับรหัสที่สมบูรณ์และการสาธิตโปรดไปที่: http://counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html
ฉันจะไปที่ปลั๊กอิน Open Layers; ดึงข้อมูลจากนั้นคุณสามารถเพิ่มเลเยอร์ไดนามิกใด ๆ ลงในแผนที่และส่งออกได้
* ก่อนดำเนินการตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าโปรเจ็กต์ CRS (EPSG) เป็น WGS84 และเปิดใช้งานการแปลง CRS 'แบบทันที' ภายใต้การตั้งค่าคุณสมบัติโครงการของคุณ
หวังว่านี่จะช่วยได้
หากคุณใช้โปรแกรมบุคคลที่สามเป็น geodjango คุณสามารถตรวจสอบจุดของคุณว่าอยู่ในรูปหลายเหลี่ยมหรือไม่ ข้อมูลเพิ่มเติมคือที่นี่
contains
Availability: PostGIS, Oracle, MySQL, SpatiaLite
Tests if the geometry field spatially contains the lookup geometry.
Example:
Zipcode.objects.filter(poly__contains=geom)
Backend SQL Equivalent
PostGIS ST_Contains(poly, geom)
Oracle SDO_CONTAINS(poly, geom)
MySQL MBRContains(poly, geom)
SpatiaLite Contains(poly, geom)
ฉันหวังว่ามันจะช่วยคุณ ...
ฉันรู้ว่ามันช้าไปหน่อย แต่มันอาจมีประโยชน์ในกรณีที่ SomeOne ไม่ลองใช้ Android-Map-Utils library ฉันโพสต์วิธีการเฉพาะของคำถามนี้สำหรับ Android เท่านั้น ไปเลย: