Python: создать сетку координат широты и долготы, которые попадают в полигон - PullRequest
1 голос
/ 16 марта 2019

Я пытаюсь нанести данные на карту. Я хотел бы сгенерировать данные для определенных точек на карте (например, время в пути до одного или нескольких заранее определенных местоположений) для конкретного города.

Я нашел данные по Нью-Йорку здесь: https://data.cityofnewyork.us/City-Government/Borough-Boundaries/tqmj-j8zm

Похоже, у них есть файл формы. Мне интересно, есть ли способ выборки сетки широта-долгота в пределах границ файла формы для каждого района (возможно, с использованием фигурного пакета и т. Д.).

Извините, если это наивно, я не очень знаком с работой с этими файлами - я делаю это как забавный проект, чтобы узнать о них

1 Ответ

2 голосов
/ 28 апреля 2019

Я понял, как это сделать.По сути, я просто создал полную сетку точек, а затем удалил те, которые не попадали в файлы форм, соответствующие районам.Вот код:

import geopandas
from geopandas import GeoDataFrame, GeoSeries
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
import matplotlib.cm as cm
%matplotlib inline
import seaborn as sns
from shapely.geometry import Point, Polygon
import numpy as np
import googlemaps
from datetime import datetime
plt.rcParams["figure.figsize"] = [8,6]

# Get the shape-file for NYC
boros = GeoDataFrame.from_file('./Borough Boundaries/geo_export_b641af01-6163-4293-8b3b-e17ca659ed08.shp')
boros = boros.set_index('boro_code')
boros = boros.sort_index()

# Plot and color by borough
boros.plot(column = 'boro_name')

# Get rid of are that you aren't interested in (too far away)
plt.gca().set_xlim([-74.05, -73.85])
plt.gca().set_ylim([40.65, 40.9])

# make a grid of latitude-longitude values
xmin, xmax, ymin, ymax = -74.05, -73.85, 40.65, 40.9
xx, yy = np.meshgrid(np.linspace(xmin,xmax,100), np.linspace(ymin,ymax,100))
xc = xx.flatten()
yc = yy.flatten()

# Now convert these points to geo-data
pts = GeoSeries([Point(x, y) for x, y in zip(xc, yc)])
in_map =  np.array([pts.within(geom) for geom in boros.geometry]).sum(axis=0)
pts = GeoSeries([val for pos,val in enumerate(pts) if in_map[pos]])

# Plot to make sure it makes sense:
pts.plot(markersize=1)

# Now get the lat-long coordinates in a dataframe
coords = []
for n, point in enumerate(pts):
    coords += [','.join(__ for __ in _.strip().split(' ')[::-1]) for _ in str(point).split('(')[1].split(')')[0].split(',')]

, что приводит к следующим графикам: boroughs

borough_gridpoints

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

transit_time_full

и увеличенная версия, чтобы вы могли видеть, как карта составлена ​​из отдельных точек: transit_time_zoom

...