Lỗi “HTTP 500.19 Errors in IIS 7” khi tạo website hay virtual directory trỏ theo đường dẫn UNC

Source: http://www.jlgaines.net/2011/05/http-50019-errors-in-iis-7-site-is-on.html

I was tinkering around my IIS 7 which comes on my Windows 7 Guest on VMWare fusion. I have my web application stored on my Mac Drive and IIS on VMWare. Apparently, when I try to share the drive via VMWare share to Windows, and I try to browse the site, I get this error :

HTTP Error 500.19 – Internal Server Error
Description: The requested page cannot be accessed because the related configuration data for the page is invalid.
Error Code: 0x8007052e
Notification: BeginRequest
Module: IIS Web Core
Requested URL: http://localhost/
Logon User: Not yet determined

Logon Method: Not yet determined
Handler: Not yet determined
Config Error: Cannot read configuration file
Config File: \\?\UNC\vmware-host\webapp




So how I made it work ? We must not use VMWare sharing but instead use Mac OSX Samba Sharing.
MAC OS X Instructions

  1. Create an account called IIS_UsrAccess on Mac OSX (or any account). Make sure that this is a sharing account for security. Remember the password you used on Mac OSX.
  2. Go to System Preference -> Sharing
  3. Tick on File Sharing
  4. Click on Options
  5. Tick : Share files and folders using SMB (Windows)
  6. On the account below, choose IIS_UsrAccess
  7. Click on Done
  8. Add a the folder you want to share to Windows under Shared Folders
  9. On the users, add IIS_UsrAccess and choose Read or Read and Write.
  10. Close.
  11. Browse the Folder via Finder
  12. Under the folder you shared, right click and choose Get Info
  13. Below, you would see Sharing and Permissions as shown here :
14. Add iss_usraccess. Now depending on the priviledge you want to grant, it could be read only or read and write.
15. Locate your web.config file on this app and do the same as point 14. If you want to manage web.config from IIS, choose read and write for iis_usraccess account.
Now we’re done on Mac OSX. We will now go to windows.
  1. Test first on your Windows if you are able to access the shared folder by going to Windows Explorer and \\\. Example, on my machine I typed \\MyMac\Web and I’m able to browse the folder.
  2. Create an iis_usraccess account on Windows and use the same password you used on Mac OSX. This is to allow account pass through.
  3. Once this is done, go to IIS Manager.
  4. Create an Application by doing Add Application or Create a Virtual Directory by clicking Add Virtual Directoy (I Assumed you already have a site
  5. On Alias, choose whatever alias you want. On Physical Path, choose \\\.
  6. Click on Connect As… and on new window, type in Specific User and then click on Set. Once Set is clicked, type in on the Username iis_usraccess and password of the user you created on windows and mac os x.
  7. Once done, click on Test Settings.
  8. It should be both green, meaning you are now able to browse the site

Hướng dẫn cơ bản về 9-patch cho Android UI

Trong quá trình tìm hiểu và phát triển ứng dụng cho Android. Tôi được biết tới 9-patch image. Ban đầu chưa làm gì tới nên tôi bỏ qua. Giờ đây có một dự án liên quan tới nó nên tôi phải đi tìm hiểu xem nó là gì, làm việc như thế nào và tạo ra bằng cách nào.

Về cơ bản, 9-patch sử dụng png transparency để tạo một dạng tiên tiến của 9-slice hoặc scale9. Guild map, là các đoạn thẳng đen 1-pixel vẽ trên cạnh của hình, nó định nghĩa vùng lặp lại (scaleable area) và vùng phủ lấp (fill area) của ảnh. Bằng cách đặt tên file ảnh là name.9.png, Android sẽ nhận ra được định dạng 9.png và sử dụng đường hướng dẫn đen để lặp (scale) và phủ lấp (fill) ảnh bitmap.

Dưới đây là một guild map cở bản:

Image

Trong hình trên, ta có các đường hướng dẫn (guild) ở mỗi cạnh của hình. Các guild bên TRÊN (TOP) và bên TRÁI (LEFT) ảnh định nghĩa vùng có thể lặp lại (scaleable area) của ảnh, các guild bên PHẢI (RIGHT) và bên DƯỚI (BOTTOM) định nghĩa vùng phủ lấp (fill area) của ảnh.

– Các đường hướng dẫn màu đen sẽ bị loại khỏi ảnh – chúng sẽ không xuất hiện trong ứng dụng.

– Các đường hướng dẫn phải là các đường có độ rộng 1 pixel. Nếu như một nút nhấn kích thước 48×48 thì 9-patch png của nó sẽ có kích thước thật là 50×50.

– Các đường hướng dẫn phải là màu đen hoàn toàn (#000000). Thậm chí chỉ một sự khác biệt nhỏ trong thuộc tính màu sắc (color) hoặc độ trong suốt (alpha) cũng sẽ là nguyên nhân khiến nó thể hiện không đúng và bị căng ra (stretch) theo cách thông thường.

– Cũng phải luôn ghi nhớ rằng, vùng còn lại của đường viền 1-pixel phải hoàn toàn trong suốt. Như vậy là bao gồm cả 4 góc của ảnh.

Image

Các đường hướng dẫn bên TRÊN và bên TRÁI được sử dụng để định nghĩa vùng lặp lại của ảnh – Bên TRÁI là định nghĩa vùng lặp theo chiều cao, bên TRÊN định nghĩa vùng lặp theo chiều rộng. Sử dụng hình ảnh một nút nhấn làm ví dụ, như vậy có nghĩa là nút nhấn có thể căng theo chiều ngang và dọc bên trong vùng màu đen và mọi thứ khác như các  góc, sẽ được giữ nguyên kích thước. Điều này cho phép nút nhấn có thể mở rộng tới bất kỳ kích thước nào mà vẫn duy trì sự thống nhất về hình ảnh.

Ghi nhớ một điều quan trọng là các ảnh 9-patch không thu hẹp được, chúng chỉ có thể mở rộng ra. Vì vậy hãy tạo ảnh có kích thước nhỏ nhất có thể.

Ngoài ra, ta có thể bỏ đi một vài phần ở giữa của đường hướng dẫn vùng lặp. Ví dụ, nếu ta có một nút nhấn với một cạnh bóng láng xuyên qua giữa của nút nhấn, ta có thể bỏ đi một vài pixel ở giữa của đường hướng dẫn bên TRÁI. Trung tâm trục ngang của ảnh sẽ không được lặp, chỉ có các phần bên trên và bên dưới của nó được lặp lại, như vậy hình của của sẽ không bị răng cưa và mờ.

Image

Các đường hướng dẫn lấp đầy là tùy chọn và cung cấp một cách thức để xác định vùng sản phẩm như text label. Vùng phủ lấp xác định bao nhiêu vị trí trong ảnh để đặt text, icon, hoặc các thứ khác, 9-patch không chỉ cho các nút nhấn, nó cũng còn được dùng như các ảnh nền.

Ví dụ về button và label bên trên được phóng đại để giải thích ý tưởng về sự phủ lấp (fill). Thực tế mà nói, tôi không có kinh nghiệm về cách mà Android làm việc với multi-line label. Thông thường, một nút nhấn hoặc label chỉ bao gồm một dòng text.

Cuối cùng, dưới đây là một demo tốt cho thấy cách mà các đường hướng dẫn mở rộng và phủ lấp làm việc, chẳng hạn như một LinearLayoit với một hình nền và các góc bo tròn.

Image

Với ví dụ này, đường hướng dẫn bên TRÁI không được sừ dụng, nhưng chúng ta vẫn buộc phải có. Ảnh nền không lặp theo chiều dọc; Nó chỉ lặp theo chiều ngang (dựa vào đường hướng dấn TRÊN). Hãy chú ý tới các đường hướng dẫn phủ lấp bên PHẢI và DƯỚI, mỏ rộng ra ngoài cho tới khi gặp các cạnh cong của ảnh. Việc này cho phép ta đặt các nút tròn gần với các cạnh của hình nền cho một cảm giác nhìn chặt chẽ và khít.

9-patch thật đơn giản đúng không! ^^

Để hiểu rõ hơn về 9 patch image và cách tạo ra nó như thế nào, xin hãy nhẫn vào link bên dưới:

Android 9 Patch Image Tutorial

Giải quyết vấn đề chạy Crystal Report với asp.net trên iis

Crystal Report được sử dụng khá phổ biến trong các ứng dụng Web ASP.NET, để tạo và xuất báo cáo thành file.

Tuy nhiên khi deploy lên Web Server (IIS) thì thường gặp lỗi không hiển thị được Crystal Report.

Nếu điều đó xảy ra với bạn thì có thể hướng dẫn dưới đây sẽ giúp được bạn:

B1: Download Cài đặt Crystal Report Runtime Engine for .NET Framework.

Bản 32 bit

Bản 64 bit

Xem chi tiết update tại: http://scn.sap.com/docs/DOC-7824

B2: Trên IIS, tìm tới ứng dụng web. Tạo Virtual Directory tại thư mục gốc (root). Alias = “aspnet_client”, Trỏ tới thư mục “C:\inetpub\wwwroot\aspnet_client”. Vì các file tài nguyên như, js,css, và hình ảnh phục vụ cho việc hiển thị Report nằm ở đó.

Image

Image

Cài đặt iOS SDK và Xcode trên Windows (7)

Apple đã cương quyết không chịu tạo ra một phiên bản iOS SDK hỗ trợ cho hệ máy chạy Windows. Nhưng thật may mắn là có một cách để có thể chạy iOS SDK và Xcode cho hầu hết các loại PC.

Các bước sau liên quan tới việc cài đặt một máy ảo (VM – virtual machine) trên PC của bạn, cập nhật VM lên 10.7, sau đó chạy VM rồi tải (download) và cài đặt (install) iOS SDK và Xcode trên VM.

Có các cách khác để cài đặt OS X trên máy của bạn nhưng chúng liên quan tới việc tạo một phân vùng mới và cài đặt Hệ điều hành trực tiếp lên ổ cứng của bạn. Các cách này khó khăn hơn và có nhiều bước khó hiểu có thể gây nguy hại cho máy tính của bạn. Cách làm trong bài viết này là dễ nhất và an toàn nhất.

Cả quá trình cài đặt sẽ mất khoảng 2-3 giờ, nhưng hầu hết thời gian làm giành cho việc download. Không mất bất cứ khoản chi phí nào cho việc này.
Hướng dẫn

1. Đầu tiên là nhấn vào đây để download và cài đặt phiên bản ảo hóa của OS X Lion lên PC của bạn. (Lưu ý: sử dụng VMWare Workstation 7.1.x trở lên)

2. Nếu bạn không có Apple Dev Account miễn phí thì có thể đăng ký ở đây. Bạn sẽ cần tới nó để có thể download Xcode 4.1 miễn phí. Trong OS X, mở App Store và download Xcode. Bạn có thể thấy được tiến trình download bên dưới Purchases tab.

3. Khi tiến trình hoàn tất sẽ có thông báo đã cài đặt xong nhưng điều đó chưa có nghĩa là đã xong thực sự. Mở thư mục Applications từ Finder. Double-click lên biểu tượng Install Xcode.

4. Làm theo hướng dẫn trên màn hình sau đó đợi cho tới khi việc cài đặt kết thúc.

5. Sau khi đã xong, nó sẽ tự khởi động. Nếu không ĐỪNG tìm iPhone SDK trên dock. Bạn cần mở ổ đĩa cứng. Sau đó Click vào Developer > Applications.

6. Bây giờ bạn sẽ thấy một biểu tượng của Xcode, click vào nó và bạn có thể bắt đầu lập trình ứng dụng.

Nếu không thấy biểu tượng, rất có thể là do không gian ổ cứng ảo không đủ. Hãy chắc chắn là bạn có tối thiểu 10GB bộ nhớ cho VM. Khởi động lại VM có thể là một cách khác.

Bây giờ bạn có thể bắt đầu viết code một ứng dụng cho riêng bạn. Ngôn ngữ bạn sẽ sử dụng cho việc lập trình là Objective-C. Nếu bạn không có kinh nghiệm về Objective-C thì bạn nên tìm hiểu thêm, có thể bắt đầu với TheNewBoston

Bạn có thể test ứng dụng của bạn trên iPhone simulator trong Xcode nhưng bạn sẽ không thể add ứng dụng vào thiết bị của bạn. Để add ứng dụng mà bạn đã tạo vào thiết bị của bạn thì cần phải làm hai tùy chọn sau.

Tùy chọn 1: Nếu bạn muốn submit ứng dụng của bạn lên App Store, bạn sẽ cần trả cho Apple 100$ cho một Official Developers Certificate. Việc này này sẽ cho phép bạn bán ứng dụng của bạn cho rất nhiều người khác mà Apple không bạn chế gì.

Tùy chọn 2: Nếu bạn không muốn trả 100$ cho Apple, bạn có thể phát triển ứng dụng của bạn cho Cydia (tương tự App Store). Tùy chọn này cũng sẽ cho phép bạn đưa ứng dụng của bạn vào iPhone.

Cydia là một App Store không chính thức cho phép người dùng đã jailbreak và muốn bán hoặc chia sẻ các ứng dụng của họ. Hầu như không có bất cứ hạn chws nào về các loại ứng dụng có thể add lên Cydia.

Để phát triển ứng dụng cho Cydia, bạn sẽ cần phải có một thiết bị đã jailbreak(Hướng dẫn jailbreak) và trước khi bạn bắt đầu phát triển ứng dụng của bạn, bạn cần phải Fake Code Signing for Xcode and sending App to Cydia.

Giải quyết vấn đề SQL Server transaction log (.LDF) files ngày càng lớn

Vấn đề:

Bỗng một ngày bạn thấy dung lượng ổ cứng chỉ còn lại rất ít. Sau một hồi kiểm tra thì phát hiện ra các file .LDF có kích thước quá lớn.

Giải pháp:

Thiết lập recovery mode của databases thành ‘simple’.

Các bước thực hiện như sau:

    1. Thực hiện full-backup database
      Chú ý: Điều này là rất quan trọng vì việc chuyển recovery mode từ full hay bulk-logged sang simple sẽ phá vỡ quá trình sao backup log. Do đó nên backup ngay trước khi chuyển đổi, việc này sẽ cho phép bạn có thể phục hồi lại trạng thái trước khi chuyển đổi nếu không may có vấn đề gì xảy ra. Sau khi chuyển đổi thì bạn nên định kỳ backup database để bảo vệ dữ liệu của bạn. [Source]
    2. Chuyển recovery mode thành SIMPLE.
      (xem thêm: What is simple recovery mode?)Chú ý quan trọng:

Simple recovery model cho phép khôi phục (restore) database tới thời điểm mà nó được backup gần nhất. Nó không cho phép khôi phục dữ liệu tại thời điểm trước khi xảy ra lỗi hay tại một thời điểm bất kỳ nào đó.”  [Source]

mssql_shrink_1

Set recover mode to simple
Set recover mode to simple
  1. Shrink the transaction log (.LDF) files.
    Don't forget to shrink
    Don’t forget to shrink

    ... the log files after changing the recovery mode.
    … the log files after changing the recovery mode.
  2. Thực hiện full-backup database.

Đây là tùy chọn cho phép bạn có thể chạy một script thực hiện các công việc bên trên:

SQL Script
SQL Script

Delete, Shrink, Eliminate Transaction Log .LDF File

Theo thời gian, Microsoft SQL Server Database Transaction Log (.LDF) file sẽ trở lên rất lớn chiếm dung lượng hàng Gigabytes. Việc này gây lãng phí rất nhiều không gian ổ đĩa và có thể gây ra một số vấn đề khi bạn muốn sao lưu (backup) hay phục hồi (restore) database.

Khi đối mặt với vấn đề này chúng ta có thể thực hiện các phương thức sau (Ở đây sử dụng Microsoft SQL Server 2008 nhưng cũng có thể áp dụng cho Microsoft SQL Server 2005).

1. Shrink (thu nhỏ) transaction log (.ldf) file

Sử dụng phương thức này có thể thu nhỏ file log xuống kích thước mong muốn, ví dụ: 1MB

+ Right-click lên database bạn muốn thu nhỏ (shrink) => Tasks => Shrink => Files

 

Microsoft SQL Server 2008 Shrink
Microsoft SQL Server 2008 Shrink

+ Trong giao diện Shrink File, chọn File type = Log và đánh dấu chọn Reorganize pages before releasing unused space sau đó thiết kích thước cho file log trong ô Shrink file to, ví dụ: 1 MB như trong hình:

Microsoft SQL Server 2008 Shrink Set Size Log FileMicrosoft SQL Server 2008 Shrink – Thiết lập kích thước log file

+ Nhân OK để thực hiện.

Ưu điểm của phương thức này là có thể thực hiện thu nhỏ ngay lập tức nhưng đôi khi nó không hoạt động với Microsoft SQL Server 2005. Khi đó hãy sử dụng phương thức thứ 2 – bên dưới.

2. Xóa hoàn toàn log file

Ý tưởng của phương thức này là xóa log file cũ (kích thước lớn) và tạo một log file mới với kích thước nhỏ nhất

Các bước thực hiện như sau:

1. Detach database

Right-click lên database => Tasks => Detach…

Microsoft SQL Server 2008 Detach
Microsoft SQL Server 2008 – Detach

2. Xóa log file cũ (file kích thước lớn)

This step will completely erase it from your hard drive. However, from my suggestion you should back up the log file somewhere, ex: rename it from the file location (my case is: C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA)

Bước này sẽ xóa toàn bộ log file cũ trên ổ đĩa cứng. Tuy nhiên để an toàn thì bạn nên sao lưu trước ra chỗ nào đó, hoặc đổi tên như hình dưới

Microsoft SQL Server 2008 Data Folder
Microsoft SQL Server 2008 – Data Folder

3. Attach database

As we deleted the log file, so we do attach the database without the log file. Don’t worry, SQL Server will create a new log file for you which will be of the minimum size. That’s perfect!

Vì log file đã bị xóa vì vậy ta sẽ attach database mà không có log file. SQL Server sẽ tạo một log file mới với kích thước nhỏ nhất.

+ Right-click lên Databases => Attach…

Microsoft SQL Server 2008 Attach
Microsoft SQL Server 2008 – Attach

+ Trong giao diệnA ttach Database, nhấn nút Add…

Microsoft SQL Server 2008 Attach AddMicrosoft SQL Server 2008 – Attach Add

+ Tìm đến và chọn database file (.mdf) sau đó nhấn OK

Microsoft SQL Server 2008 Browser MDF
Microsoft SQL Server 2008 – Tìm chọn database file .MDF

+ Chọn log file (.ldf) sau đó nhấn Remove

Microsoft SQL Server 2008 Attach Remove LogMicrosoft SQL Server 2008 – Attach Remove Log

+ Cuối cùng nhấn OK.

Ghi chú: sau khi hoàn thành các bước trên cần phải kiểm tra lại Data folder xem log file mới đã được tạo thật chưa. Nếu đã tạo thì xóa file sao lưu đi.

Nguồn: http://4rapiddev.com/sql-server/delete-shrink-eliminate-transaction-log-ldf-file/#ixzz1emkgIUzu

OpenLayers – Spherical Mercator

Spherical Mercator

This document describes the Spherical Mercator projection, what it is, and when you should use it. It includes some background information, demonstration of using the code with just a commercial layer, and how to add a WMS over the top of that layer, and how to reproject coordinates within OpenLayers so that you can reproject coordinates inside of OpenLayers. It is expected that readers of this tutorial will have a basic understanding of reprojection and a basic understanding of OpenLayers.

What is Spherical Mercator?

Spherical Mercator is a de facto term used inside the OpenLayers community – and also the other existing Open Source GIS community – to describe the projection used by Google Maps, Microsoft Virtual Earth, Yahoo Maps, and other commercial API providers.

This term is used to refer to the fact that these providers use a Mercator projection which treats the earth as a sphere, rather than a projection which treats the earth as an ellipsoid. This affects calculations done based on treating the map as a flat plane, and is therefore important to be aware of when working with these map providers.

In order to properly overlay data on top of the maps provided by the commerical API providers, it is neccesary to use this projection. This applies primarily to displaying raster tiles over the commercial API layers – such as TMS, WMS, or other similar tiles.

In order to work well with the existing commercial APIs, many users who create data designed for use within Google Maps will also use this projection. One prime example is OpenStreetMap, whose raster map tiles are all projected into the ‘spherical mercator’ projection.

Projections in GIS are commonly referred to by their “EPSG” codes, identifiers managed by the European Petroleum Survey Group. One common identifier is “EPSG:4326”, which describes maps where latitude and longitude are treated as X/Y values. Spherical Mercator has an official designation of EPSG:3857. However, before this was established, a large amount of software used the identifier EPSG:900913. This is an unofficial code, but is still the commonly used code in OpenLayers. Any time you see the string “EPSG:4326”, you can assume it describes latitude/longitude coordinates. Any time you see the string “EPSG:900913”, it will be describing coordinates in meters in x/y.

First Map

The first thing to do with the Spherical Mercator projection is to create a map using the projection. This map will be based on the Microsoft Virtual Earth API. The following HTML template will be used for the map.


 

<html>
<head>
 <title>OpenLayers Example</title>
 <script src='http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1'></script>
 <script src="http://openlayers.org/api/OpenLayers.js"></script>
 </head>
 <body>
 <div style="width:100%; height:100%" id="map"></div>
 <script defer='defer' type='text/javascript'>
 // Code goes here
 </script>
 </body>
</html>

 

Ex. 1: HTML Template

The next step is to add the default Microsoft Virtual Earth layer as a base layer to the map.

var map = new OpenLayers.Map('map'); var layer = new OpenLayers.Layer.VirtualEarth("Virtual Earth",  {      sphericalMercator: true,      maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)  }); map.addLayer(layer); map.zoomToMaxExtent();

This creates a map. However, once you have this map, there is something very important to be aware of: the coordinates that you use in setCenter are not longitude and latitude! Instead, they are in projected units – meters, in this case. This map will let you drag around, but without understanding a bit more about spherical mercator, it will be difficult to do anything more with it.

This map has a set of assumptions about the maxResolution of the map. Specifically, most spherical mercator maps use an extent of the world from -180 to 180 longitude, and from -85.0511 to 85.0511 latitude. Because the mercator projection stretches to infinity as you approach the poles, a cutoff in the north-south direction is required, and this particular cutoff results in a perfect square of projected meters. As you can see from the maxExtent parameter sent in the constructor of the layer, the coordinates stretch from -20037508.34 to 20037508.34 in each direction.

The maxResolution of the map defaults to fitting this extent into 256 pixels, resulting in a maxResolution of 156543.0339. This is handled internally by the layer, and does not need to be set in the layer options.

If you are using a standalone WMS or TMS layer with spherical mercator, you will need to specify the maxResolution property of the layer, in addition to defining the maxExtent as demonstrated here.

Working with Projected Coordinates

Thankfully, OpenLayers now provides tools to help you reproject your data on the client side. This makes it possible to transform coordinates from Longitude/Latitude to Spherical Mercator as part of your normal operation. First, we will transform coordinates for use within the setCenter and other calls. Then we will show how to use the displayProjection option on the map to modify the display of coordinate data to take into account the projection of the base map.

Reprojecting Points, Bounds

To do this, first create a projection object for your default projection. The standard latitude/longitude projection string is “EPSG:4326” – this is latitude/longitude based on the WGS84 datum. (If your data lines up correctly on Google Maps, this is what you have.)

You will then be creating an object to hold your coordinates, and transforming it.

var proj = new OpenLayers.Projection("EPSG:4326"); var point = new OpenLayers.LonLat(-71, 42); point.transform(proj, map.getProjectionObject());

The point is now projected into the spherical mercator projection, and you can pass it to the setCenter method on the map:

map.setCenter(point);

This can also be done directly in the setCenter call:

var proj = new OpenLayers.Projection("EPSG:4326"); var point = new OpenLayers.LonLat(-71, 42); map.setCenter(point.transform(proj, map.getProjectionObject()));

In this way, you can use latitude/longitude coordinates to choosing a center for your map.

You can use the same technique for reprojecting OpenLayers.Bounds objects: simply call the transfrom method on your Bounds object.

var bounds = new OpenLayers.Bounds(-74.047185, 40.679648, -73.907005, 40.882078) bounds.transform(proj, map.getProjectionObject());

Transformations take place on the existing object, so there is no need to assign a new variable.

Reprojecting Geometries

Geometry objects have the same transform method as LonLat and Bounds objects. This means that any geometry object you create in your application code must be transformed by calling the transform method on it before you add it to a layer, and any geometry objects that you take from a layer and wish to use will need to be transformed before further use.

Because all transforms are in place, once you have added a geometry to a layer, you should not call transform on the geometry directly: instead, you should transform a clone of the geometry:

var feature = vector_layer.features[0]; var geometry = feature.geometry.clone(); geometry.transform(layerProj, targetProj);

Reprojecting Vector Data

When creating projected maps, it is possible to reproject vector data onto a basemap. To do so, you must simply set the projection of your vector data correctly, and ensure that your map projection is correct.

var map = new OpenLayers.Map("map", {   projection: new OpenLayers.Projection("EPSG:900913") }); var myBaseLayer = new OpenLayers.Layer.Google("Google",               {'sphericalMercator': true,                'maxExtent': new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)               }); map.addLayer(myBaseLayer); var myGML = new OpenLayers.Layer.GML("GML", "mygml.gml", {   projection: new OpenLayers.Projection("EPSG:4326") }); map.addLayer(myGML);

Note that you can also use this setup to load any format of vector data which OpenLayers supports, including WKT, GeoJSON, KML and others. Simply specify the format option of the GML layer.

var geojson = new OpenLayers.Layer.GML("GeoJSON", "geo.json", {   projection: new OpenLayers.Projection("EPSG:4326"),   format: OpenLayers.Format.GeoJSON }); map.addLayer(geojson);

Note that even if you set the projection object on a layer, if you are adding features to the layer manually (via layer.addFeatures), they must be transformed before adding to the layer. OpenLayers will only transform the projection of geometries that are created internally to the library, to prevent duplicating projection work.

Serializing Projected Data

The way to serialize vector data in OpenLayers is to take a collection of data from a vector layer and pass it to a Format class to write out data. However, in the case of a projected map, the data that you get from this will be projected. To reproject the data when converting, you should pass the internal and external projection to the format class, then use that format to write out your data.

var format = new OpenLayers.Format.GeoJSON({   'internalProjection': new OpenLayers.Projection("EPSG:900913"),   'externalProjection': new OpenLayers.Projection("EPSG:4326") }); var jsonstring = format.write(vector_layer.features);

Display Projection on Controls

Several controls display map coordinates to the user, either directly or built into their links. The MousePosition and Permalink control (and its companion control, ArgParser) both use coordinates which match the internal projection of the map – which in the case of Spherical Mercator layers is projected. To prevent user confusion, OpenLayers allows one to set a ‘display’ projection. When these controls are used, transformation is made from the map projection to the display projection.

To use this option, when creating your map, you should specify the projection and displayProjection options. Once this is done, the controls will automatically pick up this option from the map.

var map = new OpenLayers.Map("map", {   projection: new OpenLayers.Projection("EPSG:900913"),   displayProjection: new OpenLayers.Projection("EPSG:4326") }); map.addControl(new OpenLayers.Control.Permalink()); map.addControl(new OpenLayers.Control.MousePosition());

You can then add your layer as normal.

Creating Spherical Mercator Raster Images

One of the reasons that the Spherical Mercator projection is so important is that it is the only projection which will allow for overlaying image data on top of commercial layers like Google Maps correctly. When using raster images, in the browser, it is not possible to reproject the images in the same way it might be in a ‘thick’ GIS client. Instead, all images must be in the same projection.

How to create Spherical Mercator projected tiles depends on the software you are using to generate your images. MapServer is covered in this document.

MapServer

MapServer uses proj.4 for its reprojection support. In order to enable reprojection to Spherical Mercator in MapServer, you must add the definition for the projection to your proj.4 data directories.

On Linux systems, edit the /usr/share/proj/epsg file. At the bottom of that file, add the line:

<900913> +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs

After you do this, you must add the projection to your wms_srs metdadata in your map file:

map   web     metadata       wms_srs "EPSG:4326 EPSG:900913"     end   end   # Layers go here end

This will allow you to request tiles from your MapServer WMS server in the Spherical Mercator projection, which will align with commercial provider data in OpenLayers.

var options = {     projection: new OpenLayers.Projection("EPSG:900913"),     units: "m",     maxResolution: 156543.0339,     maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34,                                      20037508.34, 20037508.34) };  map = new OpenLayers.Map('map', options);  // create Google Mercator layers var gmap = new OpenLayers.Layer.Google(     "Google Streets",     {'sphericalMercator': true,      'maxExtent': new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)     } );  // create WMS layer var wms = new OpenLayers.Layer.WMS(     "World Map",     "http://vmap0.tiles.osgeo.org/wms/vmap0",     {'layers': 'basic', 'transparent': true} );  map.addLayers(gmap, wms);

WMS layers automatically inherit the projection from the base layer of a map, so there is no need to set the projection option on the layer.

GeoServer

Current versions of GeoServer have support for EPSG:900913 built in, so there is no need to add additional projection data. Simply add your GeoServer layer as a WMS and add it to the map.

Custom Tiles

Another common use case for spherical mercator maps is to load custom tiles. Many custom tile sets are created using the same projection as Google Maps, usually with the same z/x/y scheme for accessing tiles.

If you have tiles which are set up according to the ‘Google’ tile schema – that is, based on x,y,z and starting in the upper left corner of the world – you can load these tiles with the TMS layer with a slightly modified get_url function. (Note that in the past there was a ‘LikeGoogle’ layer in SVN – this is the appropriate replacement for that code/functionality.)

First, define a getURL function that you want to use: it should accept a bounds as an argument, and will look something like this:

function get_my_url (bounds) {     var res = this.map.getResolution();     var x = Math.round ((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));     var y = Math.round ((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));     var z = this.map.getZoom();      var path = z + "/" + x + "/" + y + "." + this.type;     var url = this.url;     if (url instanceof Array) {         url = this.selectUrl(path, url);     }     return url + path;  }

Then, when creating your TMS layer, you pass in an option to tell the layer what your custom tile loading function is:

new OpenLayers.Layer.TMS("Name",                        "http://example.com/",                        { 'type':'png', 'getURL':get_my_url });

This will cause the getURL function to be overridden by your function, thus requesting your inverted google-like tiles instead of standard TMS tiles.

When doing this, your map options should contain the maxExtent and maxResolution that are used with Google Maps:

new OpenLayers.Map("map", {     maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),     numZoomLevels:18,     maxResolution:156543.0339,     units:'m',     projection: "EPSG:900913",     displayProjection: new OpenLayers.Projection("EPSG:4326") });

As describe above, when using this layer, you will interact with the map in projected coordinates.

SphericalMercator and EPSG aliases

The SphericalMercator projection in OpenLayers uses code EPSG:900913. Many other services, such as OpenStreetMap, Bing and Yahoo are now also using the same projection, but are not necessarily supporting the use of code EPSG:900913. Other codes, such as EPSG:3857 and EPSG:102113 were invented. Today, there is an officially registered EPSG code 3857 whose projection is identical to EPSG:900913. (http://www.epsg-registry.org/export.htm?gml=urn:ogc:def:crs:EPSG::3857). So, if you need to combine overlay layers that are using either an alias or the official EPSG code with an OpenLayers SphericalMercator layer, you have to make sure that OpenLayers requests EPSG:3857 or other alias in stead of EPSG:900913. You can accomplish this by overriding the layer projection before adding the layer to the map. For example:

// create sphericalmercator layers var googleLayer = new OpenLayers.Layer.Google("Google", {"sphericalMercator": true}); var osmLayer = new OpenLayers.Layer.OSM("OpenStreetMap");  // override default epsg code aliasproj = new OpenLayers.Projection("EPSG:3857"); googleLayer.projection = osmLayer.projection = aliasproj;   //add baselayers to map map.addLayers([googleLayer, osmLayer]);

At this point, overlays (such as WMS layers) will be requested using the 3857 code; transformations will work between 4326 and 3857 as expected.