Как предотвратить распространение диаграммы рассеяния за пределами карты шейп-файла? [Дубликат]

использовать функцию setinterval javascript для опроса и проверить значение обновленного поля dababase

проверить следующую ссылку для более подробной информации http://www.elated.com/articles/javascript- таймеры-с-SetTimeout-и-setinterval /

10
задан ZYX 10 December 2012 в 08:53
поделиться

5 ответов

В matplotlib.basemap есть метод: is_land(xpt, ypt)

Он возвращает True, если заданная точка x, y (в координатах проецирования) находится над землей, False в противном случае. Определение земли основано на полигонах береговой линии GSHHS, связанных с экземпляром класса. Точки над озерами внутри земельных участков не считаются точками земли.

Для получения дополнительной информации см. здесь .

6
ответ дан Skyler 16 August 2018 в 10:15
поделиться
  • 1
    Спасибо, это то, что я искал. Но когда я использую is_land, я сталкиваюсь с проблемой. Здесь . – ZYX 10 December 2012 в 13:32

is_land() будет зацикливать все полигоны, чтобы проверить, земля или нет. Для большого размера данных это очень медленно. Вы можете использовать points_inside_poly() из matplotlib, чтобы быстро проверить массив точек. Вот код. Он не проверяет lakepolygons, если вы хотите удалить точки в озерах, вы можете добавить себя.

Для проверки 100000 точек на моем компьютере потребовалось 2,7 секунды. Если вы хотите увеличить скорость, вы можете преобразовать многоугольники в растровое изображение, но это немного сложно сделать. Скажите, пожалуйста, если следующий код недостаточно для вашего набора данных.

from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.nxutils as nx

def points_in_polys(points, polys):
    result = []
    for poly in polys:
        mask = nx.points_inside_poly(points, poly)
        result.extend(points[mask])
        points = points[~mask]
    return np.array(result)

points = np.random.randint(0, 90, size=(100000, 2))
m = Basemap(projection='moll',lon_0=0,resolution='c')
m.drawcoastlines()
m.fillcontinents(color='coral',lake_color='aqua')
x, y = m(points[:,0], points[:,1])
loc = np.c_[x, y]
polys = [p.boundary for p in m.landpolygons]
land_loc = points_in_polys(loc, polys)
m.plot(land_loc[:, 0], land_loc[:, 1],'ro')
plt.show()
6
ответ дан HYRY 16 August 2018 в 10:15
поделиться
  • 1
    Я думаю, что points_inside_poly (и если я помню, что весь nxutils) амортизируется в mpl 1.2, но он также работает с новым методом (не помню, что новый метод в данный момент, но предупреждение об амортизации будет указывать Это) – bmu 11 December 2012 в 08:53
  • 2
    [Д0] matplotlib.org/1.2.1/api/… – Baz 13 February 2018 в 20:45

Ответ HYRY не будет работать над новыми версиями matplotlib (nxutils устарел). Я создал новую версию, которая работает:

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from matplotlib.path import Path
import numpy as np

map = Basemap(projection='cyl', resolution='c')

lons = [0., 0., 16., 76.]
lats = [0., 41., 19., 51.]

x, y = map(lons, lats)

locations = np.c_[x, y]

polygons = [Path(p.boundary) for p in map.landpolygons]

result = np.zeros(len(locations), dtype=bool) 

for polygon in polygons:

    result += np.array(polygon.contains_points(locations))

print result
4
ответ дан Roger Veciana 16 August 2018 в 10:15
поделиться

Я отвечал на этот вопрос , когда мне сказали, что лучше разместить мой ответ здесь. В основном, мое решение извлекает многоугольники, которые используются для рисования береговых линий экземпляра Basemap и объединяет эти многоугольники с контуром карты, чтобы создать matplotlib.PathPatch, который накладывает океанские области карты.

Это особенно полезно, если данные грубые, и интерполяция данных не нужна. В этом случае использование maskoceans создает очень зернистый контур береговых линий, который выглядит не очень хорошо.

Вот тот же пример, который я отправил как ответ на другой вопрос:

from matplotlib import pyplot as plt
from mpl_toolkits import basemap as bm
from matplotlib import colors
import numpy as np
import numpy.ma as ma
from matplotlib.patches import Path, PathPatch

fig, ax = plt.subplots()

lon_0 = 319
lat_0 = 72

##some fake data
lons = np.linspace(lon_0-60,lon_0+60,10)
lats = np.linspace(lat_0-15,lat_0+15,5)
lon, lat = np.meshgrid(lons,lats)
TOPO = np.sin(np.pi*lon/180)*np.exp(lat/90)

m = bm.Basemap(resolution='i',projection='laea', width=1500000, height=2900000, lat_ts=60, lat_0=lat_0, lon_0=lon_0, ax = ax)
m.drawcoastlines(linewidth=0.5)

x,y = m(lon,lat)
pcol = ax.pcolormesh(x,y,TOPO)

##getting the limits of the map:
x0,x1 = ax.get_xlim()
y0,y1 = ax.get_ylim()
map_edges = np.array([[x0,y0],[x1,y0],[x1,y1],[x0,y1]])

##getting all polygons used to draw the coastlines of the map
polys = [p.boundary for p in m.landpolygons]

##combining with map edges
polys = [map_edges]+polys[:]

##creating a PathPatch
codes = [
    [Path.MOVETO] + [Path.LINETO for p in p[1:]]
    for p in polys
]
polys_lin = [v for p in polys for v in p]
codes_lin = [c for cs in codes for c in cs]
path = Path(polys_lin, codes_lin)
patch = PathPatch(path,facecolor='white', lw=0)

##masking the data:
ax.add_patch(patch)

plt.show()

В результате получается следующий график:

Надеюсь, это кому-то поможет:)

2
ответ дан Thomas Kühn 16 August 2018 в 10:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: