#python #matplotlib-basemap
#python #matplotlib-базовая карта
Вопрос:
ЦЕЛЬ
- Загрузите ГИС, шейп-файл (границы округа) в базовую карту
- Используйте базовую карту для построения границ округа
- Определите, попадает ли местоположение в границы
- Присвоите вес точке в зависимости от того, на какую границу они попадают
- Используйте DBSCAN для определения центра кластера на основе координат и веса
ПОДХОД
Используя это руководство по базовой карте, загрузите шейп-файл для сопоставления.
#First, we have to import our datasets.
#These datasets include store locations, existing distribution locations, county borders, and real estate by county
walmartStores = pd.read_csv("data/walmart-stores.csv",header=0, encoding='latin1')
propertyValues = pd.read_csv("data/property values.csv")
shp = fiona.open('data/boundaries/Counties.shp')
#We need to create a workable array with Walmart Stores
longitude = walmartStores.longitude
latitude = walmartStores.latitude
stores = np.column_stack((longitude, latitude))
#We also need to load the shape file for county boundaries
extra = 0.1
bds = shp.bounds
shp.close()
#We need to assign the lower-left bound and upper-right bound
ll = (bds[0], bds[1])
ur = (bds[2], bds[3])
#concatenate the lower left and upper right into a variable called coordinates
coords = list(chain(ll, ur))
print(coords)
#define variables for the width and the height of the map
w, h = coords[2] - coords[0], coords[3] - coords[1]
с print(coords)
= [105571.4206781257, 4480951.235680977, 779932.0626624253, 4985476.422250552]
Пока все хорошо, однако я столкнулся с проблемой ниже:
m = Basemap(
#set projection to 'tmerc' to minimize map distortion
projection='tmerc',
#set longitude as average of lower, upper longitude bounds
lon_0 = np.average([bds[0],bds[2]]),
#set latitude as average of lower,upper latitude bounds
lat_0 = np.average([bds[1],bds[3]]),
#string describing ellipsoid (‘GRS80’ or ‘WGS84’, for example).
#Not sure what this does...
ellps = 'WGS84',
#set the map boundaries. Note that we use the extra variable to provide a 10% buffer around the map
llcrnrlon=coords[0] - extra * w,
llcrnrlat=coords[1] - extra 0.01 * h,
urcrnrlon=coords[2] extra * w,
urcrnrlat=coords[3] extra 0.01 * h,
#provide latitude of 'true scale.'
#check the Basemap API
lat_ts=0,
#resolution of boundary database to use. Can be c (crude), l (low), i (intermediate), h (high), f (full) or None.
resolution='i',
#don't show the axis ticks automatically
suppress_ticks = False)
m.readshapefile(
#provide the path to the shapefile, but leave off the .shp extension
'data/boundaries/Counties.shp',
#name your map something useful (I named this 'srilanka')
'nyCounties',
#set the default shape boundary coloring (default is black) and the zorder (layer order)
color='none',
zorder=2)
Ошибка: lat_0 должно быть между -90.000000 и 90.000000
ВОПРОСЫ
- lat_0 и lon_0 не находятся в диапазоне от -90 до 90. Однако lon_0 не выдает ошибку. Почему это так?
- Я искал в Интернете других, сталкивающихся с подобной проблемой, и пришел с пустыми руками. Есть ли что-то уникальное в моем ноутбуке? (ПРИМЕЧАНИЕ:
conda list
отображается `базовая карта 1.0.7, поэтому я знаю, что она установлена и запущена)
Спасибо!
Ответ №1:
Широта может быть только между -90 и 90 — все остальное не имеет смысла. Северный полюс равен 90, а Южный полюс равен -90, при этом экватор равен 0. Других приемлемых значений нет!
Что касается длины, она может быть только между -180 и 180. 0 находится на нулевом меридиане и движется к -180 (на запад) и 180 (на восток)