2012-12-13 12 views
9

मैं निम्नलिखित ईमेल प्राप्त किया और सुनिश्चित करें कि इस सवाल का जवाब हर कोई के लिए उपलब्ध था बनाना चाहते थे पार करती है की स्थापना कार्टॉपी का उपयोग करके एक साधारण अक्षांश देशांतर मानचित्र स्थापित करें, जो डेटालाइन को पार करता है और दाहिने ओर उत्तरी अमेरिका के पश्चिम के साथ बाईं ओर पूर्व एशिया दिखाता है। निम्नलिखित गूगल मानचित्र मोटे तौर पर है के बाद मैं क्या हूँ:एक नक्शा जो cartopy में डेटलाइन

https://maps.google.co.uk/?ll=56.559482,-175.253906&spn=47.333523,133.066406&t=m&z=4

Screenshot of google map

इस Cartopy के साथ किया जा सकता है?

+0

बस सवाल, उपयोगकर्ता एक सरल "अक्षांश देशांतर" नक्शा के लिए कहा पर टिप्पणी करने से है, और एक गूगल मानचित्र है, जो मेरी राय में * नहीं * एक सरल "अक्षांश है का एक स्क्रीनशॉट प्रदान की गई है देशांतर "मानचित्र। तकनीकी रूप से, Google मानचित्र संलग्न गोलाकार मर्केटर प्रक्षेपण में है; मेरे जवाब में यह माना गया है कि उपयोगकर्ता का चित्रण उद्देश्यों के लिए साजिश का मतलब था और वास्तव में, सरल "अक्षांश देशांतर" का अर्थ इक्विप्रैंगुलर/प्लेट कैरी है। – pelson

उत्तर

23

अच्छा सवाल। यह शायद कुछ ऐसा है जो समय-समय पर आ जाएगा, इसलिए मैं वास्तव में से पहले अपने विशिष्ट प्रश्न का उत्तर देने से पहले इस चरण-दर-चरण में जाऊंगा। भविष्य के संदर्भ के लिए, निम्नलिखित उदाहरण कार्टॉपी v0.5 के साथ लिखे गए थे।

सबसे पहले, यह ध्यान रखें कि डिफ़ॉल्ट "अक्षांश देशांतर" (या अधिक तकनीकी रूप से PlateCarree) प्रक्षेपण 180 -180 के आगे सीमा में काम करता है इसका मतलब यह है महत्वपूर्ण है कि आप नहीं कर सकते हैं साजिश इससे भी आगे मानक PlateCarree प्रक्षेपण । इसके लिए कई अच्छे कारण हैं, जिनमें से अधिकांश इस तथ्य को उबालते हैं कि कार्टॉपी को लॉट और अधिक काम करना होगा जब वेक्टर और रास्टर्स (उदाहरण के लिए सरल तटीय रेखाएं) पेश करते हैं। दुर्भाग्यवश जिस साजिश को आप उत्पादित करने की कोशिश कर रहे हैं वह निश्चित रूप से इस कार्यक्षमता की आवश्यकता है। चित्रों में इस सीमा को रखने के लिए, डिफ़ॉल्ट PlateCarree प्रक्षेपण लगता है:

import cartopy.crs as ccrs 
import matplotlib.pyplot as plt 

proj = ccrs.PlateCarree(central_longitude=0) 

ax1 = plt.axes(projection=proj) 
ax1.stock_img() 
plt.title('Global') 

plt.show() 

global plate carree

किसी भी एक आयत है कि आप इस नक्शे पर आकर्षित कर सकते हैं कानूनी तौर पर एक क्षेत्र में ज़ूम इन किया जा सकता है (वहाँ कुछ थोड़ा और अधिक उन्नत यहाँ कोड है, लेकिन तस्वीर एक 1000 शब्दों) के लायक है:

import cartopy.crs as ccrs 
import matplotlib.pyplot as plt 
import shapely.geometry as sgeom 

box = sgeom.box(minx=-90, maxx=45, miny=15, maxy=70) 
x0, y0, x1, y1 = box.bounds 

proj = ccrs.PlateCarree(central_longitude=0) 

ax1 = plt.subplot(211, projection=proj) 
ax1.stock_img() 
ax1.add_geometries([box], proj, facecolor='coral', 
        edgecolor='black', alpha=0.5) 
plt.title('Global') 

ax2 = plt.subplot(212, projection=proj) 
ax2.stock_img() 
ax2.set_extent([x0, x1, y0, y1], proj) 
plt.title('Zoomed in area') 

plt.show() 

global with a second zoomed in map

Unfort unately साजिश आप चाहते हैं इस प्रक्षेपण के साथ 2 आयतों की आवश्यकता होगी:

import cartopy.crs as ccrs 
import matplotlib.pyplot as plt 
import shapely.geometry as sgeom 

box = sgeom.box(minx=120, maxx=260, miny=15, maxy=80) 

proj = ccrs.PlateCarree(central_longitude=0) 

ax1 = plt.axes(projection=proj) 
ax1.stock_img() 
ax1.add_geometries([box], proj, facecolor='coral', 
        edgecolor='black', alpha=0.5) 
plt.title('Target area') 

plt.show() 

target rectangle on global plot

इसलिए यह एक ऐसा नक्शा डेटलाइन मानक PlateCarree परिभाषा का उपयोग को पार आकर्षित करने के लिए संभव नहीं है।इसके बजाय हम PlateCarree परिभाषा के केंद्रीय देशांतर बदलने एक बॉक्स अनुमति देने के लिए कर सकता है क्षेत्र हम लक्षित कर रहे हैं तैयार हो:

import cartopy.crs as ccrs 
import matplotlib.pyplot as plt 
import shapely.geometry as sgeom 

box = sgeom.box(minx=120, maxx=260, miny=15, maxy=80) 
x0, y0, x1, y1 = box.bounds 

proj = ccrs.PlateCarree(central_longitude=180) 
box_proj = ccrs.PlateCarree(central_longitude=0) 

ax1 = plt.subplot(211, projection=proj) 
ax1.stock_img() 
ax1.add_geometries([box], box_proj, facecolor='coral', 
        edgecolor='black', alpha=0.5) 
plt.title('Global') 

ax2 = plt.subplot(212, projection=proj) 
ax2.stock_img() 
ax2.set_extent([x0, x1, y0, y1], box_proj) 
plt.title('Zoomed in area') 

plt.show() 

Two PlateCarre plots with a central longitude of 180, one global, one zoomed in to the target area

उम्मीद है कि है कि आप पता चलता है कि यह आप क्या करना है है अपने लक्ष्य मानचित्र को प्राप्त करने के लिए, उपर्युक्त कोड आपके लक्ष्य को प्राप्त करने के लिए थोड़ा जटिल हो सकता है, इसलिए थोड़ा सा सरल बनाने के लिए, जो कोड मैं चाहता हूं उसे बनाने के लिए लिखने वाला कोड कुछ ऐसा होगा:

import cartopy.feature 
import cartopy.crs as ccrs 
import matplotlib.pyplot as plt  

ax = plt.axes(projection=ccrs.PlateCarree(central_longitude=180)) 
ax.set_extent([120, 260, 15, 80], crs=ccrs.PlateCarree()) 

# add some features to make the map a little more polished 
ax.add_feature(cartopy.feature.LAND) 
ax.add_feature(cartopy.feature.OCEAN) 
ax.coastlines('50m') 

plt.show() 

final target map

यह एक लंबे जवाब था, उम्मीद है कि मैं है न केवल सवाल का जवाब है, लेकिन नक्शे उत्पादन के और अधिक जटिल विवरण में से कुछ बना दिया है और भविष्य के लिए अधिक किसी भी समस्याओं आप हो सकता है सरल बनाने में सहायता करने के लिए स्पष्ट cartopy।

चीयर्स,

संबंधित मुद्दे