2016-07-28 28 views
0

我有幾點,我想檢查它們是否包含在一個多邊形。多邊形和點以緯度和經度表示。勻稱無法精確找到多邊形內的點

以下是重現我的方案和谷歌地圖打印屏幕的代碼,它看起來像多邊形,多邊形內/外的點根據Shapely。

import pyproj 
from shapely.geometry import Polygon, Point 
from shapely.ops import transform 
from functools import partial 
import numpy as np 

polygon_array = [(1.4666748046875, 49.088257784724675), 
       (1.4447021484375, 47.42808726171425), 
       (2.889404296875, 47.42808726171425), 
       (2.8729248046875, 49.08466020484928), 
       (-0.0054931640625, 47.97521412341619), 
       (0.010986328125, 46.18743678432541), 
       (1.4227294921875, 46.1912395780416), 
       (1.4337158203125, 48.4887), 
       (-1.043701171875, 46.65320687122665), 
       (-1.043701171875, 44.6061127451739), 
       (0.0164794921875, 44.5982904898401), 
       (-0.0054931640625, 46.6795944656402)] 

simple_polygon = Polygon(polygon_array) 
projection = partial(
    pyproj.transform, 
    pyproj.Proj(init='epsg:4326'), 
    pyproj.Proj('+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m [email protected] +no_defs')) 
polygon = transform(projection, simple_polygon) 

for latitude in np.arange(44.5435052132, 49.131408414, 0.071388739257): 
    for longitude in np.arange(-0.999755859375, 2.99926757812, 0.071388739257): 
     point = transform(projection, Point(longitude, latitude)) 
     if polygon.contains(point): 
      print "%s, %s" % (latitude, longitude) 

這裏是多邊形看起來在地圖上的內容:

The polygon on Google Maps

這裏是什麼樣子的點(這裏表示爲標記) 「內部」 的多邊形:

Points "inside" polygon

而「外部」點:

"outside"

這裏的問題是,這些點很明顯地脫離了多邊形,內部或外部。我對這個投影方案很陌生,所以我可能會錯過一些東西。

預先感謝您

+1

您的多邊形看起來並不像您繪製的圖片什麼(最好的,我可以告訴)。 [小提琴](http://jsfiddle.net/geocodezip/sbcd0m22/) – geocodezip

+0

@geocodezip,是的!你是正確的!我搞砸了多邊形路徑,並把它放在那裏。我不會說這個。謝謝你一噸。我建議你把你的評論作爲答案,以便我可以將其標記爲「答案」。不夠感謝你。 – Eduardo

回答

2

您的多邊形看起來並不像你畫(最佳我可以告訴)圖片什麼。

fiddle

enter image description here

代碼片段:

function initialize() { 
 
    var map = new google.maps.Map(
 
    document.getElementById("map_canvas"), { 
 
     center: new google.maps.LatLng(37.4419, -122.1419), 
 
     zoom: 13, 
 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
 
    }); 
 
    var polygon_array = [{ 
 
    lng: 1.4666748046875, 
 
    lat: 49.088257784724675 
 
    }, { 
 
    lng: 1.4447021484375, 
 
    lat: 47.42808726171425 
 
    }, { 
 
    lng: 2.889404296875, 
 
    lat: 47.42808726171425 
 
    }, { 
 
    lng: 2.8729248046875, 
 
    lat: 49.08466020484928 
 
    }, { 
 
    lng: -0.0054931640625, 
 
    lat: 47.97521412341619 
 
    }, { 
 
    lng: 0.010986328125, 
 
    lat: 46.18743678432541 
 
    }, { 
 
    lng: 1.4227294921875, 
 
    lat: 46.1912395780416 
 
    }, { 
 
    lng: 1.4337158203125, 
 
    lat: 48.4887 
 
    }, { 
 
    lng: -1.043701171875, 
 
    lat: 46.65320687122665 
 
    }, { 
 
    lng: -1.043701171875, 
 
    lat: 44.6061127451739 
 
    }, { 
 
    lng: 0.0164794921875, 
 
    lat: 44.5982904898401 
 
    }, { 
 
    lng: -0.0054931640625, 
 
    lat: 46.6795944656402 
 
    }]; 
 
    for (var i = 0; i < polygon_array.length; i++) { 
 
    var marker = new google.maps.Marker({ 
 
     map: map, 
 
     position: polygon_array[i], 
 
     title: "" + i 
 
    }) 
 
    } 
 
    var polygon = new google.maps.Polygon({ 
 
    map: map, 
 
    paths: [polygon_array], 
 
    fillOpacity: 0.5, 
 
    strokeWeight: 2, 
 
    strokeOpacity: 1, 
 
    strokeColor: "red", 
 
    fillColor: "red" 
 
    }); 
 
    var bounds = new google.maps.LatLngBounds(); 
 
    for (var i = 0; i < polygon.getPaths().getAt(0).getLength(); i++) { 
 
    bounds.extend(polygon.getPaths().getAt(0).getAt(i)); 
 
    } 
 
    map.fitBounds(bounds); 
 
} 
 
google.maps.event.addDomListener(window, "load", initialize);
html, 
 
body, 
 
#map_canvas { 
 
    height: 100%; 
 
    width: 100%; 
 
    margin: 0px; 
 
    padding: 0px 
 
}
<script src="https://maps.googleapis.com/maps/api/js"></script> 
 
<div id="map_canvas"></div>

相關問題