Yanıtlar:
Google Maps API zaten çokgenlerdeki noktaları kontrol etmek için bir yöntem sağlamıyor. Biraz araştırdıktan sonra, XY koordinatının çizilen bir şeklin içinde olup olmadığını belirleyecek Ray döküm algoritmasına rastladım. Bu, enlem ve boylam anlamına gelecektir. Aşağıda google.maps.polygon.prototype bu algoritmayı kullanacak şekilde genişletilmiştir. Bu kodu google.maps yüklendikten sonra kodun bir noktasına eklemeniz yeterlidir:
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);
}
};
Burada, işlev parametresinde sağlanan enlem boylamının çokgen içinde olup olmadığını belirlemek için kullanılabilecek 'İçerir' adında bir işlev tanımlayarak google.maps.Polygon işlevlerini genişlettik. Burada Ray döküm algoritmasını kullanıyoruz ve bunu kullanarak bir fonksiyon geliştirdik. Şimdi bu kadar egzersiz yaptıktan sonra, bir noktayı aşağıdaki gibi kontrol edebiliriz:
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
}
Tam kod ve demo için lütfen şu adrese gidin: http://counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html
Açık Katmanlar eklentisine giderdim; daha sonra haritanıza dinamik katmanı ekleyebilir ve dışa aktarabilirsiniz.
* Bunu yapmadan önce, proje CRS'nizi (EPSG) WGS84 olarak ayarladığınızdan ve Proje Özellikleri ayarlarınızda 'anında' CRS dönüşümünün etkinleştirildiğinden emin olun.
Bu yardımcı olur umarım.
geodjango olarak üçüncü taraf programı kullanıyorsanız, bir çokgen kümesi içinde olup olmadığına bakabilirsiniz. daha fazla bilgi burada .
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)
umarım sana yardımcı olur ...
Bunun biraz geç olduğunu biliyorum ama SomeOne Android-Map-Utils kütüphanesini denemediğinde yardımcı olabilir. Bu sorunun belirli yöntemlerini yalnızca Android için yayınladım. Hadi bakalım: