После истощения знаний и энергии Уильяма сегодня днём… (большое спасибо!!)… мне удалось сделать несколько крутых вещей с помощью SlippyMapper и Twitter.

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

Во-первых, нам нужно просмотреть JSON-файл твиттера, что уже может быть проблемой. Для этого вы можете проверить потрясающий учебник Анжелы здесь.

Когда вам уже удалось получить данные из вашего json-файла, вы можете понять, что у вас есть тонны твитов, и вы просто хотите отфильтровать некоторые из них.

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

import json
# filering out the tweets that do not have coordinates and write them in a file
def filterTweets():
    with open('tweetswithlocations.json', 'w+') as f:
        with open('CatalanReferendum_all.json') as file:
            for row in file:
                data=json.loads(row)
                geo = data['geo']
            
                if geo is not None:
                    tosave = json.dumps(data)
                    f.write(tosave + '\n')
                    print(tosave)

Когда у вас есть новый файл, вы можете начать сопоставление!

В основном этот код делает несколько вещей.

  1. Отрисовка карты Slippymapper для всего мира
  2. Получение широты и долготы каждого твита для размещения маркера в этой позиции.
  3. Добавление данных к этому маркеру. В данном случае это текст твита, но это может быть что угодно.
  4. Сделать его интерактивным, отображая только данные (тексты твитов), когда вы наводите курсор на маркеры.
  5. Создание интерактивного зума с помощью мыши. Карта увеличивается в этом направлении, когда вы щелкаете маркер левой кнопкой мыши, и уменьшается, когда вы щелкаете правой кнопкой мыши.

Итак, если вы заинтересованы в выполнении любой из этих вещей, просто проверьте код! Я пытался объяснить каждый шаг в коде, надеюсь понятно.

import spatialpixel.mapping.slippymapper as slippymapper
import json
from filteringwithlocation import *
def setup():
    size(1000, 800, P2D)
# creating the zoom variable to be able to make the zoom interactive later 
    global world, zoom
    # setting up the initial zoom to 2
    zoom = 2
    # connecting the variable world with slippymapper and setting the location and zoom
    world = slippymapper.SlippyMapper(0, 0, zoom, 'carto-dark', width, height)
    
    withLocations = []
    
    # opening json and making processing read the titter json file by rows
    with open('tweetswithlocations.json') as file:
        for row in file:
            data=json.loads(row)        
                     
    # appending the tweets data in withLocations
            withLocations.append(data)
                                                         
    # getting the latitude and langitude as separate values from the twitter file
    for tweet in withLocations:
        lat, lon = tuple(tweet['geo']['coordinates'])
        print(lat,lon)
        
    # getting the text of the tweet from the twitter file   
        TweetText=(tweet['text'])
        
    # adding the Datamrker with the text embeded         
        world.addMarker(lat, lon, TweetMarker({'text':TweetText}))
     
    world.render()
    
def draw():
    background(255)
    world.draw()
    
    # writing the title
    textSize(18)
    text('#Catalonia, #CatalanReferendum, #Catalan Independence, Catalan', 50,50)
# creating a class for the DataMarker with the text of the tweet as the data of the marker     
class TweetMarker(slippymapper.DataMarker):
    def drawMarker(self, x, y, marker):
        txt = self.data['text']
   
    # making the marker interactive. When you hover the market you get the text      
        if dist(x, y, mouseX, mouseY) < 7:
            # setting the marker text as the tweets text and its position and color
            marker.fill(255)
            marker.text(txt, 10, height - 200)
        
        marker.stroke(255)
        marker.ellipse(x, y, 5, 5)
# creating the zoom interaction with the mouse
def mouseClicked():
    global world, zoom
    lon = world.xToLon(mouseX)
    lat = world.yToLat(mouseY)
    
  # making zoom in
    if mouseButton == LEFT:
        zoom += 1
        # defining maximum zoom in
        if zoom > 18:
            zoom = 18
# making zoom out
    elif mouseButton == RIGHT:
        zoom -= 1
        # defining maximum zoom out
        if zoom < 1:
            zoom = 1
    
    
    world.setCenter(lat, lon)
    world.setZoom(zoom)
    world.render()

Кредиты Уильям. Еще раз спасибо!

Если вы обнаружите какую-либо ошибку или у вас есть идея, как улучшить код или лучше его объяснить, пожалуйста, дайте мне знать, и я постараюсь улучшить его как можно быстрее.

Здесь вы можете получить представление о том, что делает код: